2020-07-19 11:55:54 -04:00
|
|
|
{-# LANGUAGE TransformListComp #-}
|
2020-07-16 10:07:28 -04:00
|
|
|
module GalleryPage (make) where
|
|
|
|
|
|
|
|
import Control.Exception
|
2020-07-19 11:55:54 -04:00
|
|
|
import Data.Function (on)
|
|
|
|
import Data.List (sortOn, groupBy)
|
2020-07-16 10:07:28 -04:00
|
|
|
import qualified Data.Text.Lazy as Lazy
|
|
|
|
import System.FilePath ((</>), takeDirectory)
|
2020-07-19 11:55:54 -04:00
|
|
|
import GHC.Exts (Down (..), the)
|
2020-07-16 10:07:28 -04:00
|
|
|
|
|
|
|
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
|
|
|
|
|
2020-07-18 05:40:56 -04:00
|
|
|
make :: Text -- ^ title
|
|
|
|
-> Bool -- ^ nsfw is included?
|
|
|
|
-> [(FilePath, Info)]
|
|
|
|
-> Lazy.Text
|
|
|
|
make title nsfw infos = toLazyText $ make' title nsfw infos
|
2020-07-16 10:07:28 -04:00
|
|
|
|
2020-07-18 05:40:56 -04:00
|
|
|
make' :: Text -> Bool -> [(FilePath, Info)] -> Builder
|
|
|
|
make' title nsfw infos = [b|@0
|
2020-07-16 10:07:28 -04:00
|
|
|
<!DOCTYPE html>
|
|
|
|
<html lang=en>
|
|
|
|
<meta charset=utf-8>
|
2020-07-19 16:36:15 -04:00
|
|
|
<link rel=stylesheet href=/style/tum/gallery.css>
|
2020-07-19 12:04:40 -04:00
|
|
|
<link rel=alternate href=rss.xml type=application/rss+xml>
|
2020-07-16 10:07:28 -04:00
|
|
|
|
|
|
|
<title>$*title</title>
|
|
|
|
|
|
|
|
<header>
|
|
|
|
<h1>$*title</h1>
|
2020-07-19 12:04:40 -04:00
|
|
|
<h2 class="right corner">
|
|
|
|
<a href=rss.xml>rss</a>
|
|
|
|
</h2>
|
2020-07-16 10:07:28 -04:00
|
|
|
</header>
|
|
|
|
|
|
|
|
<main>
|
|
|
|
<ul class=grid>
|
|
|
|
$4.items
|
|
|
|
</ul>
|
|
|
|
</main>
|
|
|
|
|]
|
|
|
|
where
|
2020-07-18 05:43:35 -04:00
|
|
|
items = map (uncurry $ makeYearItems nsfw) infosByYear
|
|
|
|
infosByYear =
|
2020-07-19 11:55:54 -04:00
|
|
|
[(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)
|
2020-07-18 05:43:35 -04:00
|
|
|
|
|
|
|
makeYearItems :: Bool -- ^ nsfw
|
|
|
|
-> Integer -- ^ year
|
|
|
|
-> [(FilePath, Info)]
|
|
|
|
-> Builder
|
|
|
|
makeYearItems nsfw year infos = [b|@4
|
|
|
|
<li class="item year-marker">
|
|
|
|
<span class=year-text>$^year</span>
|
|
|
|
$4.items
|
|
|
|
|]
|
|
|
|
where items = map (uncurry $ makeItem nsfw) infos
|
2020-07-16 10:07:28 -04:00
|
|
|
|
2020-07-18 05:40:56 -04:00
|
|
|
makeItem :: Bool -> FilePath -> Info -> Builder
|
2020-07-19 11:58:19 -04:00
|
|
|
makeItem nsfw file info@(Info {title}) = [b|@4
|
2020-07-18 05:40:56 -04:00
|
|
|
<li $cls>
|
2020-07-16 10:07:28 -04:00
|
|
|
<figure>
|
|
|
|
<a href="$@dir">
|
|
|
|
<img src="$@thumb">
|
|
|
|
</a>
|
2020-07-19 11:58:19 -04:00
|
|
|
<figcaption>$*title</figcaption>
|
2020-07-16 10:07:28 -04:00
|
|
|
</figure>
|
|
|
|
|]
|
|
|
|
where
|
|
|
|
dir = takeDirectory file
|
|
|
|
thumb = maybe (throw $ NoThumb dir) (\t -> dir </> thumbFile t) $ #thumb info
|
2020-07-18 05:40:56 -04:00
|
|
|
cls | nsfw && #anyNsfw info = [b|class="item nsfw"|]
|
|
|
|
| otherwise = [b|class=item|]
|