{-# LANGUAGE TransformListComp #-} module GalleryPage (make) where import Control.Exception import Data.Function (on) import Data.List (sortOn, groupBy) import qualified Data.Text.Lazy as Lazy import System.FilePath ((), takeDirectory) import GHC.Exts (Down (..), the) import BuilderQQ import Depend (thumbFile) import Info newtype NoThumb = NoThumb FilePath deriving stock Eq deriving anyclass Exception instance Show NoThumb where show (NoThumb dir) = "no thumbnail for " ++ dir make :: Text -- ^ title -> Bool -- ^ nsfw is included? -> [(FilePath, Info)] -> Lazy.Text make title nsfw infos = toLazyText $ make' title nsfw infos make' :: Text -> Bool -> [(FilePath, Info)] -> Builder make' title nsfw infos = [b|@0 $*title

$*title

rss

|] where items = map (uncurry $ makeYearItems nsfw) infosByYear infosByYear = [(the year, infopath) | infopath@(_, info) <- infos, then sortOn by Down info, let year = #year info, then group by Down year using groupBy'] groupBy' f = groupBy ((==) `on` f) makeYearItems :: Bool -- ^ nsfw -> Integer -- ^ year -> [(FilePath, Info)] -> Builder makeYearItems nsfw year infos = [b|@4
  • $^year $4.items |] where items = map (uncurry $ makeItem nsfw) infos makeItem :: Bool -> FilePath -> Info -> Builder makeItem nsfw file info@(Info {title}) = [b|@4
  • $*title
    |] where dir = takeDirectory file thumb = maybe (throw $ NoThumb dir) (\t -> dir thumbFile t) $ #thumb info cls | nsfw && #anyNsfw info = [b|class="item nsfw"|] | otherwise = [b|class=item|]