module Buildfile.Stylesheet where
import Data.Aeson.Types (KeyValue ((.=)), ToJSON (toJSON), object)
import Data.Maybe (isJust)
import Data.Text (Text)
import Data.Text qualified as Text
import Data.Text.Lazy qualified as LazyText
import Shoggoth.Configuration (Mode (Development), getMode)
import Shoggoth.Prelude (Action, Url, getEnvWithDefault, takeBaseName)
import Shoggoth.Routing (RoutingTable)
import Shoggoth.Routing qualified as Route (url)
data Stylesheet = Stylesheet
{ stylesheetTitle :: Text,
stylesheetRelation :: Text,
stylesheetId :: Text,
stylesheetEnabled :: Bool,
stylesheetUrl :: Url,
stylesheetIntegrity :: Maybe LazyText.Text
}
alternate :: Stylesheet -> Stylesheet
alternate ss = ss {stylesheetRelation = "stylesheet", stylesheetEnabled = False}
fromFilePath ::
( ?getDigest :: FilePath -> Action (Maybe LazyText.Text),
?routingTable :: RoutingTable
) =>
FilePath ->
Action Stylesheet
fromFilePath out = do
let id = Text.pack (takeBaseName out)
(url, integrity) <- (,) <$> Route.url out <*> ?getDigest out
return $
Stylesheet
{ stylesheetTitle = Text.toTitle id,
stylesheetRelation = "stylesheet",
stylesheetId = "stylesheet-" <> id,
stylesheetEnabled = True,
stylesheetUrl = url,
stylesheetIntegrity = integrity
}
instance ToJSON Stylesheet where
toJSON Stylesheet {..} =
object
[ "title" .= stylesheetTitle,
"rel" .= stylesheetRelation,
"id" .= stylesheetId,
"enabled" .= stylesheetEnabled,
"url" .= stylesheetUrl,
"integrity" .= stylesheetIntegrity
]