diff --git a/make-pages/GalleryPage.hs b/make-pages/GalleryPage.hs index 5080d60..d68c9d5 100644 --- a/make-pages/GalleryPage.hs +++ b/make-pages/GalleryPage.hs @@ -5,6 +5,8 @@ import Control.Exception import Data.Foldable import Data.Function (on, (&)) import qualified Data.HashMap.Strict as HashMap +import Data.HashSet (HashSet) +import qualified Data.HashSet as HashSet import Data.List (intersperse, groupBy, sortOn) import qualified Data.Text.Lazy as Lazy import System.FilePath ((), takeDirectory, joinPath, splitPath) @@ -23,7 +25,7 @@ make ginfo infos = toLazyText $ make' ginfo infos make' :: GalleryInfo -> [(FilePath, Info)] -> Builder -make' (GalleryInfo {title, prefix, filters}) infos = [b|@0 +make' (GalleryInfo {title, prefix, filters, hidden}) infos = [b|@0 @@ -89,18 +91,22 @@ make' (GalleryInfo {title, prefix, filters}) infos = [b|@0 & concatMap (map (,1) . tagsFor nsfw . #second) & HashMap.fromListWith (+) & HashMap.toList & sortOn (\(tag, count) -> (Down count, tag)) - requireFilters = map (uncurry $ makeFilter "require") allTags - excludeFilters = map (uncurry $ makeFilter "exclude") allTags + + requireFilters = map (uncurry $ makeFilter "require" mempty) allTags + excludeFilters = map (uncurry $ makeFilter "exclude" hidden) allTags nsfw = #nsfw filters /= NoNsfw -makeFilter :: Text -> Text -> Int -> Builder -makeFilter prefix tag count = [b|@8 +makeFilter :: Text -> HashSet Text -> Text -> Int -> Builder +makeFilter prefix initial tag _count = [b|@8
  • - + |] - where id' = [b|$*prefix$&_$tag'|]; tag' = escId tag + where + id' = [b|$*prefix$&_$tag'|] + tag' = escId tag + checked = if HashSet.member tag initial then " checked" else "" makeYearItems :: Bool -- ^ nsfw -> Integer -- ^ year diff --git a/make-pages/Info.hs b/make-pages/Info.hs index 6d07873..73bfd47 100644 --- a/make-pages/Info.hs +++ b/make-pages/Info.hs @@ -13,6 +13,8 @@ import Records import Control.Applicative import Data.Foldable (find) +import Data.Hashable (Hashable) +import Data.HashSet (HashSet) import qualified Data.HashSet as HashSet import qualified Data.Map.Strict as Map import Data.Maybe (isJust, isNothing, fromMaybe) @@ -175,7 +177,8 @@ data GalleryInfo = title :: !Text, desc :: !Text, prefix :: !FilePath, - filters :: !GalleryFilters + filters :: !GalleryFilters, + hidden :: !(HashSet Text) -- ^ tags to initially hide } deriving (Eq, Show) @@ -183,7 +186,7 @@ data GalleryFilters = GalleryFilters { nsfw :: !NsfwFilter, artist :: !ArtistFilter, - require, exclude :: ![Text] + require, exclude :: !(HashSet Text) } deriving (Eq, Show) @@ -225,10 +228,9 @@ noFilters = matchFilters :: GalleryFilters -> Info -> Bool matchFilters (GalleryFilters {nsfw, artist, require, exclude}) i = matchNsfw nsfw i && matchArtist artist i && - all (∊ tags) require && all (∉ tags) exclude - where - tags = HashSet.fromList $ #tags i - (∊) = HashSet.member; x ∉ xs = not $ x ∊ xs + all (\t -> HashSet.member t tags) require && + all (\t -> not $ HashSet.member t tags) exclude + where tags = HashSet.fromList $ #tags i instance FromYAML GalleryInfo where @@ -237,6 +239,7 @@ instance FromYAML GalleryInfo where <*> m .: "desc" <*> m .: "prefix" <*> m .:? "filters" .!= noFilters + <*> m .:? "hidden" .!= mempty instance FromYAML GalleryFilters where parseYAML = YAML.withMap "gallery filters" \m -> @@ -283,3 +286,6 @@ instance FromYAML Day where instance {-# OVERLAPPING #-} FromYAML String where parseYAML y = Text.unpack <$> parseYAML y + +instance (FromYAML a, Eq a, Hashable a) => FromYAML (HashSet a) where + parseYAML y = HashSet.fromList <$> parseYAML y diff --git a/make-pages/make-pages.cabal b/make-pages/make-pages.cabal index 40312b9..b3e8f39 100644 --- a/make-pages/make-pages.cabal +++ b/make-pages/make-pages.cabal @@ -58,6 +58,7 @@ executable make-pages containers ^>= 0.6.0.1, filemanip ^>= 0.3.6.3, filepath ^>= 1.4.2.1, + hashable ^>= 1.3.0.0, HsYAML ^>= 0.2.1.0, optparse-applicative ^>= 0.15.1.0, template-haskell ^>= 2.16.0.0,