packages feed

battleships-1.0.0: img-gen/Main.hs

{-# LANGUAGE CPP #-}
module Main where

import           Logic.Render
import           Control.Monad
import           Control.Monad.Reader
import qualified Data.ByteString.Lazy as BSL
import           Diagrams.Prelude
import           Diagrams.Backend.SVG
import           Text.Blaze.Svg.Renderer.Utf8 (renderSvg)
import           System.FilePath
import qualified Settings (staticDir)


data ImgGenOpt = ImgGenOpt
  { optOutputDir :: FilePath
  } deriving (Show)

defaultOptions :: ImgGenOpt
defaultOptions = ImgGenOpt
  { optOutputDir = Settings.staticDir </> "img"
  }

type Dia = QDiagram SVG R2 Any

main :: IO ()
main = flip runReaderT defaultOptions $ do
  liftIO $ putStrLn "generating legend icons..."
  forM_ [minBound..maxBound :: LegendIcon] writeImageFile
  forM_ [0,5,10,15,20] $ writeImageFile . TLIWater
  forM_ [0,5,10,15,20] $ writeImageFile . TLIMarker
  writeImageFile GridBG

-------------------------------------------------------------------------------
-- * Diagram Rendering
-------------------------------------------------------------------------------

diaToSVG :: Dia -> BSL.ByteString
diaToSVG = renderSvg
#if MIN_VERSION_diagrams_svg(0,8,0)
  . renderDia SVG (SVGOptions Absolute Nothing)
#else
  . renderDia SVG (SVGOptions Absolute)
#endif

-------------------------------------------------------------------------------
-- * Class
-------------------------------------------------------------------------------

class ImageFile a where
  imageName   :: a -> String
  imageRender :: a -> Dia

instance ImageFile LegendIcon where
  imageName   = show
  imageRender = renderLegend

instance ImageFile TimedLegendIcon where
  imageName = show
  imageRender = renderTimedLegend

-------------------------------------------------------------------------------
-- * Grid Background
-------------------------------------------------------------------------------

data GridBG = GridBG

instance ImageFile GridBG where
  imageName _   = "grid"
  imageRender _ = fmap (const $ Any True) renderGrid

-------------------------------------------------------------------------------
-- * Icons
-------------------------------------------------------------------------------

writeImageFile :: ImageFile a => a -> ReaderT ImgGenOpt IO ()
writeImageFile img = do
  fileName <- imageFileName img
  liftIO $ do 
    BSL.writeFile fileName (diaToSVG $ imageRender img)
    putStrLn $ concat ["'", fileName, "' written"]

imageFileName
  :: (MonadReader ImgGenOpt m, ImageFile a)
  => a -> m FilePath
imageFileName img = do
  dir <- asks optOutputDir
  return $ dir </> (imageName img ++ ".svg")