module Depend (dependSingle, dependSingle', dependGallery, dependGallery', thumbFile, pageFile, bigFile) where import BuilderQQ hiding (CanBuild (..)) import Info hiding (Text) import Data.Maybe (fromMaybe, mapMaybe) import Data.Text.Lazy (Text) import System.FilePath dependSingle :: FilePath -- ^ yaml file name (relative to data dir!) -> FilePath -- ^ index file name -> Info -> FilePath -- ^ output prefix -> FilePath -- ^ build dir -> Bool -- ^ include nsfw? -> Text dependSingle yamlDir indexFile info prefix build nsfw = toLazyText $ dependSingle' yamlDir indexFile info prefix build nsfw dependSingle' :: FilePath -> FilePath -> Info -> FilePath -> FilePath -> Bool -> Builder dependSingle' yamlDir indexFile info prefix build nsfw = [b|$page: $deps $indexFile $$(MAKEPAGES)|] where images = #all if nsfw then #images info else #sfwImages info paths = map #path images thumb = thumbFile $ thumbnail info jxls fs = [base <.> "jxl" | f <- fs, let (base, ext) = splitExtension f, ext `elem` imgTypes] imgTypes = words ".png .jpg .gif" imgFiles0 = thumb : map pageFile paths ++ map bigFile paths imgFiles = imgFiles0 ++ jxls imgFiles0 dls = mapMaybe #download images extras = #extras info dir = build prefix yamlDir page = dir "index.html" deps = unwords $ map (dir ) $ imgFiles ++ dls ++ extras dependGallery :: GalleryInfo -> FilePath -- ^ index file -> [(FilePath, Info)] -- ^ relative to data dir -> FilePath -- ^ build dir -> FilePath -- ^ data dir -> FilePath -- ^ tmp dir -> Text dependGallery ginfo index infos build data_ tmp = toLazyText $ dependGallery' ginfo index infos build data_ tmp dependGallery' :: GalleryInfo -> FilePath -> [(FilePath, Info)] -> FilePath -> FilePath -> FilePath -> Builder dependGallery' (GalleryInfo {prefix, filters}) indexFile infos' build data_ tmp = [b|@0 $index: $gallery $gallery: $pages' $files' $rss $indexFile $$(MAKEPAGES) $$(call gallery,$indexFile,$prefix) $rss: $files' $indexFile $$(MAKEPAGES) $$(call rss,$indexFile,$prefix,$data_) $rules $incs |] where infos = filter (matchFilters filters . #second) infos' files = map #first infos files' = unwords $ map (data_ ) files page d = build prefix takeDirectory d "index.html" pages = map page files pages' = unwords pages index = build "index.html" gallery = build prefix "index.html" rss = build prefix "rss.xml" rules = makeRules prefix indexFile filters build data_ tmp inc d = tmp prefix takeDirectory d <.> "mk" incFiles = unwords $ map inc files incs = if null infos then "" else [b|include $incFiles|] makeRules :: FilePath -- ^ prefix -> FilePath -- ^ index file -> GalleryFilters -> FilePath -- ^ build dir -> FilePath -- ^ data dir -> FilePath -- ^ tmp dir -> Builder makeRules prefix indexFile filters build data_ tmp = [b|@0 $buildPrefix/%/index.html: $data_/%/info.yaml $$(MAKEPAGES) $$(call single,$data_,$prefix,$indexFile,$flags) $tmpPrefix/%.mk: $data_/%/info.yaml $$(MAKEPAGES) $$(call depend-single,$prefix,$indexFile,$build,$data_,$flags) $buildPrefix/%: $tmp/% $$(call copy,-l) $buildPrefix/%: $data_/% $$(call copy) |] where buildPrefix = build prefix tmpPrefix = tmp prefix flags = filtersToFlags filters filtersToFlags :: GalleryFilters -> Builder filtersToFlags (GalleryFilters {nsfw}) = case nsfw of NoNsfw -> ""; _ -> "-n" thumbnail :: Info -> FilePath thumbnail = fromMaybe (error "no thumbnail or sfw images") . #thumb