diff --git a/Makefile b/Makefile index 5d799cd..4d31084 100644 --- a/Makefile +++ b/Makefile @@ -5,30 +5,44 @@ INFONAME = info.yaml # SMALL = thumbnails, MED = single pages (link to full size) SMALL := 200 -MED := 1200 +MED := 1000 MAKEPAGES = $(TMPDIR)/make-pages -YAMLS != find $(DATADIR) -iname "*.yaml" +YAMLS != find $(DATADIR) -name $(INFONAME) -all: make-pages $(BUILDDIR)/index.html +SCRIPTS := $(wildcard script/*.js) +STYLES := $(wildcard style/*.css style/*.png) +FONTS := $(shell find fonts \ + -iname '*.eot' -or -iname '*.svg' -or \ + -iname '*.ttf' -or -iname '*.woff' -or \ + -iname '*.woff2' -or -iname '*.css') +STATIC := $(SCRIPTS) $(STYLES) $(FONTS) +BSTATIC := $(patsubst %,$(BUILDDIR)/%,$(STATIC)) + +all: make-pages $(BUILDDIR)/index.html $(BSTATIC) + +$(BUILDDIR)/%: % + echo "[copy] "$@ + mkdir -p $(dir $@) + cp $< $@ $(BUILDDIR)/index.html: $(DATADIR)/galleries.yaml $(MAKEPAGES) echo "[index]" mkdir -p $(dir $@) - $(MAKEPAGES) index $< -o $@ + $(MAKEPAGES) $(MPFLAGS) index $< -o $@ -$(MAKEPAGES): make-pages +$(MAKEPAGES): make-pages/*.hs make-pages/make-pages.cabal echo "[make-pages]" mkdir -p $(dir $@) - cabal v2-build all -O0 + cabal v2-build all -O0 -j find dist-newstyle -name make-pages -executable -type f \ -exec cp {} $@ \; $(TMPDIR)/galleries.d: $(DATADIR)/galleries.yaml $(MAKEPAGES) - echo "[gallery-deps] "$@ + echo "[deps] "$@ mkdir -p $(dir $@) - $(MAKEPAGES) depend-gallery $< -o $@ \ + $(MAKEPAGES) $(MPFLAGS) depend-gallery $< -o $@ \ -B $(BUILDDIR) -D $(DATADIR) -T $(TMPDIR) -I $(INFONAME) -include $(TMPDIR)/galleries.d diff --git a/make-pages/Depend.hs b/make-pages/Depend.hs index 28cbe50..7b4be3a 100644 --- a/make-pages/Depend.hs +++ b/make-pages/Depend.hs @@ -64,7 +64,8 @@ dependGallery' (GalleryInfo {title, prefix, filters}) infos' build data_ tmp = $@path: $@files' echo "[gallery] "$$@ mkdir -p $$(dir $$@) - $$(MAKEPAGES) gallery -t "$*title" -o "$$@" $$< + $$(MAKEPAGES) $$(MPFLAGS) gallery -t "$*title" -o "$$@" \ + $$(filter $$(DATADIR)/%/$$(INFONAME),$$^) $rules @@ -79,29 +80,29 @@ makeRules :: FilePath -- ^ prefix -> Builder makeRules prefix filters build data_ tmp = [b|@0 $@buildPrefix/%/index.html: $@data_/%/info.yaml - echo "[single] "$$@ + echo "[single] "$$@ mkdir -p $$(dir $$@) - $$(MAKEPAGES) single "$$<" -o "$$@" $flags + $$(MAKEPAGES) $$(MPFLAGS) single "$$<" -o "$$@" $flags $@tmpPrefix/%.d: $@data_/%/info.yaml - echo "[deps] "$$@ + echo "[deps] "$$@ mkdir -p $$(dir $$@) - $$(MAKEPAGES) depend-single $flags \ + $$(MAKEPAGES) $$(MPFLAGS) depend-single $flags \ -o "$$@" -p "$@prefix" -B "$@build" -D "$@data_" $$< $@buildPrefix/%: $@data_/% - echo "[copy] "$$@ + echo "[copy] "$$@ mkdir -p $$(dir $$@) cp "$$<" "$$@" $@buildPrefix/%_small.png: $@data_/%.png - echo "[resize] "$$@ + echo "[resize] "$$@ mkdir -p $$(dir $$@) convert -resize '$$(SMALL)x$$(SMALL)^' \ -gravity center -crop 1:1+0 "$$<" "$$@" $@buildPrefix/%_med.png: $@data_/%.png - echo "[resize] "$$@ + echo "[resize] "$$@ mkdir -p $$(dir $$@) convert -resize '$$(MED)x$$(MED)>' "$$<" "$$@" |] diff --git a/make-pages/GalleryPage.hs b/make-pages/GalleryPage.hs index 6adc043..062eefb 100644 --- a/make-pages/GalleryPage.hs +++ b/make-pages/GalleryPage.hs @@ -21,6 +21,7 @@ make' title infos = [b|@0 + $*title diff --git a/make-pages/IndexPage.hs b/make-pages/IndexPage.hs index 3ef8c1e..d389822 100644 --- a/make-pages/IndexPage.hs +++ b/make-pages/IndexPage.hs @@ -14,6 +14,7 @@ make' ginfos = [b|@0 + gallery list @@ -31,9 +32,11 @@ make' ginfos = [b|@0 items = map makeItem ginfos makeItem :: GalleryInfo -> Builder -makeItem (GalleryInfo {title, prefix}) = [b|@4 -
  • - - $*title - +makeItem (GalleryInfo {title, prefix, filters}) = [b|@4 + $*title |] + where + nsfw = if hasNsfw filters then " class=nsfw" else "" + +hasNsfw :: GalleryFilters -> Bool +hasNsfw (GalleryFilters {nsfw}) = nsfw /= Just False diff --git a/make-pages/Info.hs b/make-pages/Info.hs index 8bd48da..96b3208 100644 --- a/make-pages/Info.hs +++ b/make-pages/Info.hs @@ -1,3 +1,4 @@ +{-# OPTIONS_GHC -fdefer-typed-holes #-} {-# OPTIONS_GHC -Wno-orphans #-} module Info (Info (..), Artist (..), Image (..), Link (..), @@ -27,11 +28,11 @@ data Info = date :: !Day, title :: !(Maybe Text), artist :: !(Maybe Artist), -- nothing = me, obv - warning :: !(Maybe Text), tags :: ![Text], nsfwTags :: ![Text], description :: !(Maybe Text), images :: ![Image], + background :: !(Maybe Text), thumb' :: !(Maybe FilePath), links :: ![Link] } @@ -46,9 +47,10 @@ data Artist = data Image = Image { - label :: !Text, - path :: !FilePath, - nsfw :: !Bool + label :: !Text, + path :: !FilePath, + nsfw :: !Bool, + warning :: !(Maybe Text) } deriving (Eq, Show) @@ -80,11 +82,11 @@ instance FromYAML Info where Info <$> m .: "date" <*> m .:? "title" <*> m .:? "artist" - <*> m .:? "warning" <*> m .:? "tags" .!= [] <*> m .:? "nsfw-tags" .!= [] <*> m .:? "description" <*> m .: "images" + <*> m .:? "background" <*> m .:? "thumb" <*> m .:? "links" .!= [] @@ -95,10 +97,29 @@ instance FromYAML Artist where Artist <$> m .: "name" <*> m .:? "url" instance FromYAML Image where - parseYAML = labelledOptNsfw Image "path" "path" + parseYAML y = do + Pair label rest <- parseYAML y + asStr label rest <|> asObj label rest + where + asStr label = YAML.withStr "path" \(Text.unpack -> path) -> + pure $ Image {label, path, nsfw = False, warning = Nothing} + asObj label = YAML.withMap "image info" \m -> do + path <- m .: "path" + nsfw <- m .:? "nsfw" .!= False + warning <- m .:? "warning" + pure $ Image {label, path, nsfw, warning} instance FromYAML Link where - parseYAML = labelledOptNsfw Link "url" "url" + parseYAML y = do + Pair title rest <- parseYAML y + asStr title rest <|> asObj title rest + where + asStr title = YAML.withStr "url" \url -> + pure $ Link {title, url, nsfw = False} + asObj title = YAML.withMap "link info" \m -> do + url <- m .: "url" + nsfw <- m .:? "nsfw" .!= False + pure $ Link {title, url, nsfw} data GalleryInfo = @@ -166,33 +187,6 @@ instance (FromYAML a, FromYAML b) => FromYAML (Pair a b) where _ -> fail "expected exactly one pair" -data OptNsfw a = NoNsfw !a | WithNsfw !a !Bool - -appOptNsfw :: (a -> Bool -> b) -> OptNsfw a -> b -appOptNsfw f (NoNsfw x) = f x False -appOptNsfw f (WithNsfw x n) = f x n - -labelledOptNsfw :: FromYAML a - => (Text -> a -> Bool -> b) - -> String -- ^ name in \"expected\" message - -> Text -- ^ field name - -> YAML.Node YAML.Pos -> YAML.Parser b -labelledOptNsfw f name field y = do - Pair l n' <- parseYAML y - n <- parseOptNsfw name field n' - pure $ appOptNsfw (f l) n - -parseOptNsfw :: FromYAML a - => String -- ^ name in \"expected\" message - -> Text -- ^ field name - -> YAML.Node YAML.Pos -> YAML.Parser (OptNsfw a) -parseOptNsfw name field y = yes y <|> no y where - yes = YAML.withMap (name <> " & nsfw") \m -> - WithNsfw <$> m .: field - <*> m .:? "nsfw" .!= False - no = fmap NoNsfw . parseYAML - - instance FromYAML Day where parseYAML = YAML.withStr "date" \str -> case readMaybe $ Text.unpack str of diff --git a/make-pages/SinglePage.hs b/make-pages/SinglePage.hs index ccc80f7..a040dd2 100644 --- a/make-pages/SinglePage.hs +++ b/make-pages/SinglePage.hs @@ -30,29 +30,38 @@ make nsfw = toLazyText . make' nsfw make' :: Bool -> Info -> Builder make' nsfw (Info {date, title, artist, tags, nsfwTags, - description, images, links}) = [b|@0 + description, images, background, links}) = [b|@0 + + $titleTag
    $titleHeader $artistTag -

    $formattedDate +

    $formattedDate

    $buttonBar
    + +
    - - - +
    + $warning' + + + +
    - $descSection +
    + $descSection - $tagsList + $tagsList - $linksList + $linksList +