{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Diagrams.Backend.Postscript.CmdLine
(
mainWith
, defaultMain
, multiMain
, pagesMain
, animMain
, Postscript
, B
) where
import qualified Data.ByteString.Builder as B
import System.IO (IOMode (..), withFile)
import Diagrams.Backend.CmdLine
import Diagrams.Backend.Postscript
import Diagrams.Prelude hiding (height, interval, option,
output, value, width, (<>))
import Data.List.Split
defaultMain :: QDiagram Postscript V2 Double Any -> IO ()
defaultMain :: QDiagram Postscript V2 Double Any -> IO ()
defaultMain = QDiagram Postscript V2 Double Any -> IO ()
forall d. (Mainable d, Parseable (MainOpts d)) => d -> IO ()
mainWith
instance Mainable (QDiagram Postscript V2 Double Any) where
type MainOpts (QDiagram Postscript V2 Double Any) = DiagramOpts
mainRender :: MainOpts (QDiagram Postscript V2 Double Any)
-> QDiagram Postscript V2 Double Any -> IO ()
mainRender MainOpts (QDiagram Postscript V2 Double Any)
opts QDiagram Postscript V2 Double Any
d = DiagramOpts -> (Options Postscript V2 Double -> IO ()) -> IO ()
chooseRender MainOpts (QDiagram Postscript V2 Double Any)
DiagramOpts
opts (QDiagram Postscript V2 Double Any
-> Options Postscript V2 Double -> IO ()
renderDia' QDiagram Postscript V2 Double Any
d)
chooseRender :: DiagramOpts -> (Options Postscript V2 Double -> IO ()) -> IO ()
chooseRender :: DiagramOpts -> (Options Postscript V2 Double -> IO ()) -> IO ()
chooseRender DiagramOpts
opts Options Postscript V2 Double -> IO ()
renderer =
case [Char] -> [Char] -> [[Char]]
forall a. Eq a => [a] -> [a] -> [[a]]
splitOn [Char]
"." (DiagramOpts
optsDiagramOpts -> Getting [Char] DiagramOpts [Char] -> [Char]
forall s a. s -> Getting a s a -> a
^.Getting [Char] DiagramOpts [Char]
Lens' DiagramOpts [Char]
output) of
[[Char]
""] -> [Char] -> IO ()
putStrLn [Char]
"No output file given."
[[Char]]
ps | [[Char]] -> [Char]
forall a. [a] -> a
last [[Char]]
ps [Char] -> [[Char]] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [[Char]
"eps"]
Bool -> Bool -> Bool
|| [[Char]] -> [Char]
forall a. [a] -> a
last [[Char]]
ps [Char] -> [[Char]] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [[Char]
"ps"] -> do
let outfmt :: OutputFormat
outfmt = OutputFormat
EPS
sizeSpec :: SizeSpec V2 Double
sizeSpec = Int -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Double) -> SizeSpec V2 Int -> SizeSpec V2 Double
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Int -> Maybe Int -> SizeSpec V2 Int
forall n. Num n => Maybe n -> Maybe n -> SizeSpec V2 n
mkSizeSpec2D (DiagramOpts
optsDiagramOpts
-> Getting (Maybe Int) DiagramOpts (Maybe Int) -> Maybe Int
forall s a. s -> Getting a s a -> a
^.Getting (Maybe Int) DiagramOpts (Maybe Int)
Lens' DiagramOpts (Maybe Int)
width) (DiagramOpts
optsDiagramOpts
-> Getting (Maybe Int) DiagramOpts (Maybe Int) -> Maybe Int
forall s a. s -> Getting a s a -> a
^.Getting (Maybe Int) DiagramOpts (Maybe Int)
Lens' DiagramOpts (Maybe Int)
height)
Options Postscript V2 Double -> IO ()
renderer ([Char]
-> SizeSpec V2 Double
-> OutputFormat
-> Options Postscript V2 Double
PostscriptOptions (DiagramOpts
optsDiagramOpts -> Getting [Char] DiagramOpts [Char] -> [Char]
forall s a. s -> Getting a s a -> a
^.Getting [Char] DiagramOpts [Char]
Lens' DiagramOpts [Char]
output) SizeSpec V2 Double
sizeSpec OutputFormat
outfmt)
| Bool
otherwise -> [Char] -> IO ()
putStrLn ([Char] -> IO ()) -> [Char] -> IO ()
forall a b. (a -> b) -> a -> b
$ [Char]
"Unknown file type: " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [[Char]] -> [Char]
forall a. [a] -> a
last [[Char]]
ps
renderDias' :: [QDiagram Postscript V2 Double Any] -> Options Postscript V2 Double -> IO ()
renderDias' :: [QDiagram Postscript V2 Double Any]
-> Options Postscript V2 Double -> IO ()
renderDias' [QDiagram Postscript V2 Double Any]
ds Options Postscript V2 Double
o = Options Postscript V2 Double
-> [QDiagram Postscript V2 Double Any] -> IO [()]
forall m.
(Semigroup m, Monoid m) =>
Options Postscript V2 Double
-> [QDiagram Postscript V2 Double m] -> IO [()]
renderDias Options Postscript V2 Double
o [QDiagram Postscript V2 Double Any]
ds IO [()] -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
renderDia' :: QDiagram Postscript V2 Double Any -> Options Postscript V2 Double -> IO ()
renderDia' :: QDiagram Postscript V2 Double Any
-> Options Postscript V2 Double -> IO ()
renderDia' QDiagram Postscript V2 Double Any
d Options Postscript V2 Double
o = do
let b :: Result Postscript V2 Double
b = Postscript
-> Options Postscript V2 Double
-> QDiagram Postscript V2 Double Any
-> Result Postscript V2 Double
forall b (v :: * -> *) n m.
(Backend b v n, HasLinearMap v, Metric v, Typeable n,
OrderedField n, Monoid' m) =>
b -> Options b v n -> QDiagram b v n m -> Result b v n
renderDia Postscript
Postscript Options Postscript V2 Double
o QDiagram Postscript V2 Double Any
d
[Char] -> IOMode -> (Handle -> IO ()) -> IO ()
forall r. [Char] -> IOMode -> (Handle -> IO r) -> IO r
withFile (Options Postscript V2 Double
o Options Postscript V2 Double
-> Getting [Char] (Options Postscript V2 Double) [Char] -> [Char]
forall s a. s -> Getting a s a -> a
^. Getting [Char] (Options Postscript V2 Double) [Char]
Lens' (Options Postscript V2 Double) [Char]
psfileName) IOMode
WriteMode ((Handle -> IO ()) -> IO ()) -> (Handle -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Handle
h -> Handle -> Builder -> IO ()
B.hPutBuilder Handle
h Builder
Result Postscript V2 Double
b
multiMain :: [(String, QDiagram Postscript V2 Double Any)] -> IO ()
multiMain :: [([Char], QDiagram Postscript V2 Double Any)] -> IO ()
multiMain = [([Char], QDiagram Postscript V2 Double Any)] -> IO ()
forall d. (Mainable d, Parseable (MainOpts d)) => d -> IO ()
mainWith
instance Mainable [(String,QDiagram Postscript V2 Double Any)] where
type MainOpts [(String,QDiagram Postscript V2 Double Any)] = (DiagramOpts, DiagramMultiOpts)
mainRender :: MainOpts [([Char], QDiagram Postscript V2 Double Any)]
-> [([Char], QDiagram Postscript V2 Double Any)] -> IO ()
mainRender = MainOpts [([Char], QDiagram Postscript V2 Double Any)]
-> [([Char], QDiagram Postscript V2 Double Any)] -> IO ()
forall d.
Mainable d =>
(MainOpts d, DiagramMultiOpts) -> [([Char], d)] -> IO ()
defaultMultiMainRender
pagesMain :: [QDiagram Postscript V2 Double Any] -> IO ()
pagesMain :: [QDiagram Postscript V2 Double Any] -> IO ()
pagesMain = [QDiagram Postscript V2 Double Any] -> IO ()
forall d. (Mainable d, Parseable (MainOpts d)) => d -> IO ()
mainWith
instance Mainable [QDiagram Postscript V2 Double Any] where
type MainOpts [QDiagram Postscript V2 Double Any] = DiagramOpts
mainRender :: MainOpts [QDiagram Postscript V2 Double Any]
-> [QDiagram Postscript V2 Double Any] -> IO ()
mainRender MainOpts [QDiagram Postscript V2 Double Any]
opts [QDiagram Postscript V2 Double Any]
ds = DiagramOpts -> (Options Postscript V2 Double -> IO ()) -> IO ()
chooseRender MainOpts [QDiagram Postscript V2 Double Any]
DiagramOpts
opts ([QDiagram Postscript V2 Double Any]
-> Options Postscript V2 Double -> IO ()
renderDias' [QDiagram Postscript V2 Double Any]
ds)
animMain :: Animation Postscript V2 Double -> IO ()
animMain :: Animation Postscript V2 Double -> IO ()
animMain = Animation Postscript V2 Double -> IO ()
forall d. (Mainable d, Parseable (MainOpts d)) => d -> IO ()
mainWith
instance Mainable (Animation Postscript V2 Double) where
type MainOpts (Animation Postscript V2 Double) = (DiagramOpts, DiagramAnimOpts)
mainRender :: MainOpts (Animation Postscript V2 Double)
-> Animation Postscript V2 Double -> IO ()
mainRender = (DiagramOpts -> QDiagram Postscript V2 Double Any -> IO ())
-> Lens' DiagramOpts [Char]
-> (DiagramOpts, DiagramAnimOpts)
-> Animation Postscript V2 Double
-> IO ()
forall opts b (v :: * -> *) n.
(opts -> QDiagram b v n Any -> IO ())
-> Lens' opts [Char]
-> (opts, DiagramAnimOpts)
-> Animation b v n
-> IO ()
defaultAnimMainRender DiagramOpts -> QDiagram Postscript V2 Double Any -> IO ()
forall d. Mainable d => MainOpts d -> d -> IO ()
mainRender Lens' DiagramOpts [Char]
output