module RSS (make, make') where import Date import Info import BuilderQQ import Data.List (sortBy) import Data.Maybe (isJust) import Data.Function (on) import qualified Data.Text as Strict import qualified Data.Text.Lazy as Lazy import System.FilePath (takeDirectory) make :: Strict.Text -- ^ website root e.g. @https://gallery.niss.website@ -> GalleryInfo -> Maybe FilePath -- ^ output filename for self link -> [(FilePath, Info)] -> Lazy.Text make root ginfo output infos = toLazyText $ make' root ginfo output infos make' :: Strict.Text -> GalleryInfo -> Maybe FilePath -> [(FilePath, Info)] -> Builder make' root ginfo@(GalleryInfo {title, desc, prefix}) output infos = [b|@0 $title $link $desc $selflink $4.items |] where link = [b|$root/$prefix|] nsfw = ginfo.nsfw items = map (uncurry $ makeItem root prefix nsfw) $ sortBy (flip (compareFor nsfw `on` snd)) $ filter (not . (.unlisted) . snd) infos selflink = case output of Nothing -> "" Just o -> [b||] makeItem :: Strict.Text -> FilePath -> Bool -> FilePath -> Info -> Builder makeItem root prefix nsfw path i@(Info {title, artist}) = [b|@4 $title$up $link $link $descArtist' $date |] where up = if hasUpdatesFor nsfw i then [b| (updated)|] else "" dir = takeDirectory path link = [b|$root/$prefix/$dir|] artist' = ifJust artist \case Artist {name, url = Nothing} -> [b|

by $name|] Artist {name, url = Just url} -> [b|

by $name|] desc = descFor nsfw i desc' = makeDesc desc descArtist' = if desc.exists || isJust artist then [b|@6 |] else "" date = formatRSS $ latestDateFor nsfw i makeDesc :: Desc -> Builder makeDesc NoDesc = "" makeDesc (TextDesc txt) = [b|$txt|] makeDesc (LongDesc fs) = [b|

$fields
|] where fields = map makeField fs makeField (DescField {name, text}) = [b|
$name
$text|]