{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
module Text.Pandoc.Filter.Plot.Monad.Types (
Toolkit(..)
, Script
, CheckResult(..)
, InclusionKey(..)
, FigureSpec(..)
, SaveFormat(..)
, cls
, extension
, toolkits
, inclusionKeys
, Executable(..)
, exeFromPath
, isWindows
) where
import Data.Char (toLower)
import Data.List (intersperse)
import Data.String (IsString (..))
import Data.Text (Text, pack)
import Data.Yaml (FromJSON, ToJSON(toJSON))
import GHC.Generics (Generic)
import System.FilePath (splitFileName)
import System.Info (os)
import Text.Pandoc.Definition (Attr)
toolkits :: [Toolkit]
toolkits = enumFromTo minBound maxBound
data Toolkit
= Matplotlib
| Matlab
| PlotlyPython
| PlotlyR
| Mathematica
| Octave
| GGPlot2
| GNUPlot
| Graphviz
| Bokeh
| Plotsjl
deriving (Bounded, Eq, Enum, Generic, Ord)
instance Show Toolkit where
show Matplotlib = "Python/Matplotlib"
show Matlab = "MATLAB"
show PlotlyPython = "Python/Plotly"
show PlotlyR = "R/Plotly"
show Mathematica = "Mathematica"
show Octave = "GNU Octave"
show GGPlot2 = "ggplot2"
show GNUPlot = "gnuplot"
show Graphviz = "graphviz"
show Bokeh = "Python/Bokeh"
show Plotsjl = "Julia/Plots.jl"
cls :: Toolkit -> Text
cls Matplotlib = "matplotlib"
cls Matlab = "matlabplot"
cls PlotlyPython = "plotly_python"
cls PlotlyR = "plotly_r"
cls Mathematica = "mathplot"
cls Octave = "octaveplot"
cls GGPlot2 = "ggplot2"
cls GNUPlot = "gnuplot"
cls Graphviz = "graphviz"
cls Bokeh = "bokeh"
cls Plotsjl = "plotsjl"
data Executable = Executable FilePath Text
exeFromPath :: FilePath -> Executable
exeFromPath fp = let (dir, name) = splitFileName fp
in Executable dir (pack name)
type Script = Text
data CheckResult
= CheckPassed
| CheckFailed Text
deriving (Eq)
instance Semigroup CheckResult where
(<>) CheckPassed a = a
(<>) a CheckPassed = a
(<>) (CheckFailed msg1) (CheckFailed msg2) = CheckFailed (msg1 <> msg2)
instance Monoid CheckResult where
mempty = CheckPassed
data InclusionKey
= DirectoryK
| CaptionK
| SaveFormatK
| WithSourceK
| CaptionFormatK
| PreambleK
| DpiK
| ExecutableK
| DependenciesK
| FileK
| MatplotlibTightBBoxK
| MatplotlibTransparentK
deriving (Bounded, Eq, Enum)
instance Show InclusionKey where
show DirectoryK = "directory"
show CaptionK = "caption"
show SaveFormatK = "format"
show WithSourceK = "source"
show CaptionFormatK = "caption_format"
show PreambleK = "preamble"
show DpiK = "dpi"
show ExecutableK = "executable"
show DependenciesK = "dependencies"
show FileK = "file"
show MatplotlibTightBBoxK = "tight_bbox"
show MatplotlibTransparentK = "transparent"
inclusionKeys :: [InclusionKey]
inclusionKeys = enumFromTo (minBound::InclusionKey) maxBound
data FigureSpec = FigureSpec
{ toolkit :: !Toolkit
, caption :: !Text
, withSource :: !Bool
, script :: !Script
, saveFormat :: !SaveFormat
, directory :: !FilePath
, dpi :: !Int
, dependencies :: ![FilePath]
, extraAttrs :: ![(Text, Text)]
, blockAttrs :: !Attr
}
data SaveFormat
= PNG
| PDF
| SVG
| JPG
| EPS
| GIF
| TIF
| WEBP
| HTML
deriving (Bounded, Enum, Eq, Show, Generic)
instance IsString SaveFormat where
fromString s
| s `elem` ["png", "PNG", ".png"] = PNG
| s `elem` ["pdf", "PDF", ".pdf"] = PDF
| s `elem` ["svg", "SVG", ".svg"] = SVG
| s `elem` ["eps", "EPS", ".eps"] = EPS
| s `elem` ["gif", "GIF", ".gif"] = GIF
| s `elem` ["jpg", "jpeg", "JPG", "JPEG", ".jpg", ".jpeg"] = JPG
| s `elem` ["tif", "tiff", "TIF", "TIFF", ".tif", ".tiff"] = TIF
| s `elem` ["webp", "WEBP", ".webp"] = WEBP
| s `elem` ["html", "HTML", ".html"] = HTML
| otherwise = errorWithoutStackTrace $
mconcat [ s
, " is not one of valid save format : "
, mconcat $ intersperse ", " $ show <$> saveFormats
]
where
saveFormats = (enumFromTo minBound maxBound) :: [SaveFormat]
instance FromJSON SaveFormat
instance ToJSON SaveFormat where
toJSON = toJSON . extension
extension :: SaveFormat -> String
extension fmt = mconcat [".", fmap toLower . show $ fmt]
isWindows :: Bool
isWindows = os `elem` ["mingw32", "win32", "cygwin32"]