lang/laantas-script/Main.hs

56 lines
1.8 KiB
Haskell

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