packages feed

kitchen-sink-0.1.0.0: src/KitchenSink/Layout/Blog/ArticleTypes.hs

module KitchenSink.Layout.Blog.ArticleTypes where

import Data.List qualified as List

import KitchenSink.Core.Assembler (runAssembler)
import KitchenSink.Core.Assembler.Sections
import KitchenSink.Core.Build.Site ()
import KitchenSink.Core.Section hiding (Section)
import KitchenSink.Layout.Blog.Extensions (Article, AssemblerError)
import KitchenSink.Prelude

-- | Internal relay type for picking a given rendering function.
data ArticleLayout
    = UnknownLayout Text
    | ErrorLayout AssemblerError
    | PublishedArticle
    | UpcomingArticle
    | ArchivedArticle
    | IndexPage
    | TopicListingTemplate
    | HashTagListingTemplate
    | GlossaryPage
    | SinglePageApp
    | ImageGallery
    | VariousListing
    | DocumentationPage
    | CorporatePage
    | DynamicPage
    deriving (Show, Eq)

{- | Layouts that never get an ordinary static article target: the
consolidated listings (topics, hashtags, glossary) are built from the whole
site by dedicated targets instead, and 'DynamicPage' is request-time-only
(see "KitchenSink.Engine.Dynamic") so it has no static rendering at all --
'produce' and the dev-server's @\/dev\/targets@ simply skip it.
-}
isSpecialLayout :: ArticleLayout -> Bool
isSpecialLayout l = l `List.elem` [TopicListingTemplate, HashTagListingTemplate, GlossaryPage, DynamicPage]

layoutNameFor :: Article [Text] -> ArticleLayout
layoutNameFor art =
    case runAssembler (json @() @BuildInfoData art isBuildInfo) of
        Left err -> ErrorLayout err
        Right s ->
            let binfo = extract s
             in case publicationStatus binfo of
                    Nothing -> effectiveLayout Public (layout binfo)
                    Just status -> effectiveLayout status (layout binfo)

-- | TODO: find a proper name for the user-input layout-type that we find in the BuildInfo section.
effectiveLayout :: PublicationStatus -> Text -> ArticleLayout
effectiveLayout Public "article" = PublishedArticle
effectiveLayout Public "index" = IndexPage
effectiveLayout Public "topics" = TopicListingTemplate
effectiveLayout Public "hashtags" = HashTagListingTemplate
effectiveLayout Public "glossary" = GlossaryPage
effectiveLayout Public "application" = SinglePageApp
effectiveLayout Public "gallery" = ImageGallery
effectiveLayout Public "listing" = VariousListing
effectiveLayout Public "documentation" = DocumentationPage
effectiveLayout Public "corporate" = CorporatePage
effectiveLayout Public "dynamic" = DynamicPage
effectiveLayout Public t = UnknownLayout t
effectiveLayout Upcoming "article" = UpcomingArticle
effectiveLayout Upcoming "application" = SinglePageApp
effectiveLayout Upcoming "gallery" = ImageGallery
effectiveLayout Upcoming "listing" = VariousListing
effectiveLayout Upcoming "documentation" = DocumentationPage
effectiveLayout Upcoming "corporate" = CorporatePage
effectiveLayout Upcoming t = UnknownLayout t
effectiveLayout Archived "article" = ArchivedArticle
effectiveLayout Archived t = UnknownLayout t