gallery/make-pages/Main.hs

82 lines
2.5 KiB
Haskell
Raw Normal View History

2020-07-07 18:21:08 -04:00
module Main (main) where
import qualified Data.ByteString.Lazy as ByteString
import qualified Data.YAML as YAML
import qualified Data.Text.Lazy.IO as Text
2020-07-09 00:20:57 -04:00
import qualified Options.Applicative as Opt
import Text.Printf (printf)
2020-07-09 00:20:57 -04:00
import Control.Applicative
import SinglePage
data Options =
SinglePage {
file :: FilePath,
includeNsfw :: Bool,
output :: Maybe FilePath,
copyImages :: Bool
2020-07-09 00:20:57 -04:00
}
| GalleryPage {
directory :: FilePath,
includeNsfw :: Bool,
output :: Maybe FilePath,
single :: Bool
2020-07-09 00:20:57 -04:00
}
deriving Show
2020-07-09 00:20:57 -04:00
optionsParser :: Opt.ParserInfo Options
optionsParser =
(Opt.hsubparser (single <> gallery) <**> Opt.helper) `Opt.info` mainInfo
where
single = Opt.command "single" $ singleOpts `Opt.info` singleInfo
singleOpts = SinglePage <$> fileArg <*> nsfwSwitch <*> outputOpt <*> copyOpt
2020-07-09 00:20:57 -04:00
fileArg = Opt.strArgument $
Opt.metavar "FILE" <> Opt.help "yaml file to read"
nsfwSwitch = Opt.switch $
Opt.short 'n' <> Opt.long "nsfw" <>
Opt.help "include nsfw versions"
outputOpt = Opt.option (Just <$> Opt.str) $
Opt.short 'o' <> Opt.long "output" <>
Opt.value Nothing <>
Opt.help "output file (default: stdout)"
copyOpt = Opt.switch $
Opt.short 'c' <> Opt.long "copy" <>
Opt.help "copy mentioned image files to output directory"
2020-07-09 00:20:57 -04:00
singleInfo = Opt.progDesc "generate a page for a single work"
gallery = Opt.command "gallery" $ galleryOpts `Opt.info` galleryInfo
galleryOpts =
GalleryPage <$> dirArg <*> nsfwSwitch <*> outputOpt <*> singleOpt
2020-07-09 00:20:57 -04:00
dirArg = Opt.strArgument $
Opt.metavar "DIR" <> Opt.help "directory to search for yaml files"
singleOpt = fmap not $ Opt.switch $
Opt.short 'S' <> Opt.long "exclude-single" <>
Opt.help "do not generate single pages"
2020-07-09 00:20:57 -04:00
galleryInfo = Opt.progDesc "generate a gallery page"
mainInfo = Opt.progDesc "static gallery site generator" <> Opt.fullDesc
2020-07-07 18:21:08 -04:00
main :: IO ()
2020-07-09 00:20:57 -04:00
main = main2 =<< Opt.execParser optionsParser
main2 :: Options -> IO ()
main2 s@(SinglePage {file, includeNsfw, output}) = do
print s
page <- make includeNsfw <$> readYAML file
2020-07-09 00:20:57 -04:00
case output of
Nothing -> Text.putStr page
Just out -> Text.writeFile out page
main2 g@(GalleryPage {}) = do
print g
2020-07-09 00:20:57 -04:00
error "surprise! this doesn't exist yet"
readYAML :: YAML.FromYAML a => FilePath -> IO a
readYAML file = do
txt <- ByteString.readFile file
case YAML.decode1 txt of
Right val -> pure val
Left (YAML.Pos {posLine, posColumn}, err) ->
fail $ printf "%s:%i:%i: %s" file posLine posColumn err