{-| Module : MetaHS.EDSL.Graph.Utils Description : Utilities for handling graphs Copyright : Copyright (C) 2017-2019 H.H.R.F. Vos, S. Kamps License : -- This file is distributed under the terms of the Apache License 2.0. For more information, see the file "LICENSE", which is included in the distribution. Stability : experimental Utilities for handling graphs -} module MetaHS.EDSL.Graph.Utils ( graphToImage ) where import Data.Text.Lazy (Text) import Control.Exception (try,SomeException) import System.IO (hPutStrLn,stderr) import Data.Graph.Inductive (Node) import Data.GraphViz import Data.GraphViz.Printing (renderDot) import MetaHS.EDSL.Graph.Types -- | Generates an image from a graph and writes this to a file in the specified -- format using the specified Graphviz layouter. graphToImage :: GraphvizCommand -- ^ The Graphviz layouter to use. -> GraphvizOutput -- ^ The output format. -> FilePath -- ^ The FilePath to use for the generated image. -> GraphType -- ^ The graph to render. -> ParamsType -- ^ The graph parameters to use. -> IO FilePath -- ^ The FilePath used for the generated image. graphToImage cmd outp path graph params = writeImage cmd outp path $ graphToDotGraph graph params -- | Converts a graph and parameters to a DotGraph Node. graphToDotGraph :: GraphType -- ^ The graph to convert. -> ParamsType -- ^ The graph parameters to use. -> DotGraph Node -- ^ The resulting DotGraph Node. graphToDotGraph graph params = adjustStrict $ graphToDot params graph -- | Generates an image from a DotGraph Node and writes this to a file in the -- specified format using the specified Graphviz layouter. writeImage :: GraphvizCommand -- ^ The Graphviz layouter to use. -> GraphvizOutput -- ^ The output format. -> FilePath -- ^ The FilePath to use for the generated image. -> DotGraph Node -- ^ The graph to generate. -> IO FilePath -- ^ The FilePath used for the generated image. writeImage cmd outp path dg = do result <- try (runGraphvizCommand cmd dg' outp path) :: IO (Either SomeException FilePath) case result of Left _ -> do hPutStrLn stderr $ "Failed to write image " ++ path ++ "." return "" Right _ -> return path where dg' :: DotGraph Text dg' = parseDotGraph . renderDot . toDot $ adjustStrict dg -- | Adjusts the DOT strict setting for a DotGraph Node. This option will be -- enabled if the graph is undirected. adjustStrict :: DotGraph Node -> DotGraph Node adjustStrict a = setStrictness (not $ graphIsDirected a) a