import Prelude hiding (getContents, readFile, writeFile, putStrLn) import Svg import Glyphs (doGlyphs, lineHeight') import Split import Options.Applicative import Data.Functor import Data.Text.IO (readFile, getContents) import Data.Text.Lazy.IO (writeFile, putStrLn) data Options = Opts { width, size, stroke :: {-# UNPACK #-} !Double, inFile, outFile :: Maybe FilePath, text :: Maybe Text, color :: Text } deriving Show options :: IO Options options = execParser desc where desc = info (opts <**> helper) $ fullDesc <> header "render lántas text as svg" opts = Opts <$> dimOpt 'W' "width" 1000 <*> (dimOpt' 'S' "size" "text size" 60 <&> (/ lineHeight')) <*> dimOpt' 'K' "stroke" "line thickness" 2 <*> filePath 'i' "input" <*> filePath 'o' "output" <*> text <*> color dimOpt s l d = dimOpt' s l l d dimOpt' s l n d = option auto $ mconcat [short s, long l, help $ n <> " in pixels", metavar "SIZE", value d] filePath s n = optional $ option str $ mconcat [short s, long n, help $ n <> " file", metavar "FILE"] text = optional $ option str $ mconcat [short 't', long "text", help $ "use given text instead of a file", metavar "TEXT"] color = option str $ mconcat [short 'C', long "color", help $ "set stroke color (any css syntax)", metavar "COLOR", value "black"] main :: IO () main = do Opts {..} <- options txt <- split <$> if | Just t <- text -> pure t | Just "-" <- inFile -> getContents | Just i <- inFile -> readFile i | otherwise -> fail "no input given" let res = prettyText $ doGlyphs txt (E {..}) case outFile of Just o | o /= "-" -> writeFile o res _ -> putStrLn res