{-# LANGUAGE OverloadedStrings #-}
module Text.Pandoc.Filter.Pyplot.Configuration (
configuration
, writeConfig
, inclusionKeys
, directoryKey
, captionKey
, dpiKey
, includePathKey
, saveFormatKey
, withLinksKey
, isTightBboxKey
, isTransparentKey
) where
import Data.Maybe (fromMaybe)
import Data.Default.Class (def)
import qualified Data.Text as T
import qualified Data.Text.IO as T
import Data.Yaml
import Data.Yaml.Config (loadYamlSettings, ignoreEnv)
import System.Directory (doesFileExist)
import Text.Pandoc.Filter.Pyplot.Types
data ConfigPrecursor
= ConfigPrecursor
{ defaultDirectory_ :: FilePath
, defaultIncludePath_ :: Maybe FilePath
, defaultWithLinks_ :: Bool
, defaultSaveFormat_ :: String
, defaultDPI_ :: Int
, tightBbox_ :: Bool
, transparent_ :: Bool
, interpreter_ :: String
, flags_ :: [String]
}
instance FromJSON ConfigPrecursor where
parseJSON (Object v) = ConfigPrecursor
<$> v .:? (T.pack directoryKey) .!= (defaultDirectory def)
<*> v .:? (T.pack includePathKey)
<*> v .:? (T.pack withLinksKey) .!= (defaultWithLinks def)
<*> v .:? (T.pack saveFormatKey) .!= (extension $ defaultSaveFormat def)
<*> v .:? (T.pack dpiKey) .!= (defaultDPI def)
<*> v .:? (T.pack isTightBboxKey) .!= (isTightBbox def)
<*> v .:? (T.pack isTransparentKey) .!= (isTransparent def)
<*> v .:? "interpreter" .!= (interpreter def)
<*> v .:? "flags" .!= (flags def)
parseJSON _ = fail "Could not parse the configuration"
renderConfiguration :: ConfigPrecursor -> IO Configuration
renderConfiguration prec = do
includeScript <- fromMaybe mempty $ T.readFile <$> defaultIncludePath_ prec
let saveFormat' = fromMaybe (defaultSaveFormat def) $ saveFormatFromString $ defaultSaveFormat_ prec
return $ Configuration { defaultDirectory = defaultDirectory_ prec
, defaultIncludeScript = includeScript
, defaultSaveFormat = saveFormat'
, defaultWithLinks = defaultWithLinks_ prec
, defaultDPI = defaultDPI_ prec
, isTightBbox = tightBbox_ prec
, isTransparent = transparent_ prec
, interpreter = interpreter_ prec
, flags = flags_ prec
}
configuration :: FilePath -> IO Configuration
configuration fp = loadYamlSettings [fp] [] ignoreEnv >>= renderConfiguration
writeConfig :: FilePath -> Configuration -> IO ()
writeConfig fp config = do
fileExists <- doesFileExist fp
if fileExists
then error $ mconcat ["File ", fp, " already exists."]
else encodeFile fp config