{- | Generation of a raphviz description of the view tree
-}
module Graphviz(
graphviz
, viewName
) where
import Data.Tree(drawTree,Tree(..))
import Types
import Data.List.Split
import Control.Monad.Trans.Writer.Lazy
_graphviz :: Show a => Tree a -> Writer String ()
_graphviz (Node a []) = return ()
_graphviz (Node a l) = do
let printEdge startN (Node endN _) = do
tell (show startN)
tell " -> "
tell (show endN)
tell ";\n"
mapM_ (printEdge a) l
mapM_ _graphviz l
-- | Convert the view tree to a textual description in graphviz format
graphviz :: Tree String -> String
graphviz r = execWriter $ do
tell "digraph view {\n"
_graphviz r
tell "};\n"
-- | Get the shortened name of a view (class name with hexadecimal number identifying the object)
viewName :: (String,View) -> String
viewName (viewName,_) = shortName viewName
shortName :: String -> String
shortName = mkName . reverse . wordsBy (`elem` ".@")
where
mkName (a:b:_) = b ++ "@" ++ a
mkName s = error $ "at least two name should be contained in the list : " ++ show s