module Depend (dependSingle, dependSingle', dependGallery, dependGallery', thumbFile, pageFile) where import BuilderQQ 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!) -> Info -> FilePath -- ^ output prefix -> FilePath -- ^ build dir -> Bool -- ^ include nsfw? -> Text dependSingle yamlDir info prefix build nsfw = toLazyText $ dependSingle' yamlDir info prefix build nsfw dependSingle' :: FilePath -> Info -> FilePath -> FilePath -> Bool -> Builder dependSingle' yamlDir info prefix build nsfw = [b|$page: $deps $$(MAKEPAGES)|] where images = if nsfw then #images info else #sfwImages info paths = map #path images dls = mapMaybe #download images extras = #extras info dir = build prefix yamlDir page = dir "index.html" deps = unwords $ map (dir ) $ thumbFile (thumbnail info) : map pageFile paths ++ paths ++ 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 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 -> GalleryFilters -> FilePath -- ^ build dir -> FilePath -- ^ data dir -> FilePath -- ^ tmp dir -> Builder makeRules prefix filters build data_ tmp = [b|@0 $buildPrefix/%/index.html: $data_/%/info.yaml $$(MAKEPAGES) $$(call single,$data_,$prefix,$flags) $tmpPrefix/%.mk: $data_/%/info.yaml $$(MAKEPAGES) $$(call depend-single,$prefix,$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