diff --git a/src/GF/Speech/FiniteState.hs b/src/GF/Speech/FiniteState.hs index a57328a03..f897c1425 100644 --- a/src/GF/Speech/FiniteState.hs +++ b/src/GF/Speech/FiniteState.hs @@ -5,9 +5,9 @@ -- Stability : (stable) -- Portability : (portable) -- --- > CVS $Date: 2005/09/14 18:00:19 $ +-- > CVS $Date: 2005/09/15 18:10:44 $ -- > CVS $Author: bringert $ --- > CVS $Revision: 1.10 $ +-- > CVS $Revision: 1.11 $ -- -- A simple finite state network module. ----------------------------------------------------------------------------- @@ -125,12 +125,11 @@ prFAGraphviz = Dot.prGraphviz . toGraphviz toGraphviz :: (Eq n,Show n) => FA n String String -> Dot.Graph toGraphviz (FA (Graph _ ns es) s f) = Dot.Graph Dot.Directed [] (map mkNode ns) (map mkEdge es) where mkNode (n,l) = Dot.Node (show n) attrs - where attrs = [("label",l)] + where attrs = [("label",l)] ++ if n == s then [("shape","box")] else [] ++ if n `elem` f then [("style","bold")] else [] mkEdge (x,y,l) = Dot.Edge (show x) (show y) [("label",l)] - -- -- * Graphs -- diff --git a/src/GF/Visualization/Graphviz.hs b/src/GF/Visualization/Graphviz.hs index fe2dd0b82..a98899b81 100644 --- a/src/GF/Visualization/Graphviz.hs +++ b/src/GF/Visualization/Graphviz.hs @@ -5,9 +5,9 @@ -- Stability : (stable) -- Portability : (portable) -- --- > CVS $Date: 2005/09/14 15:17:30 $ +-- > CVS $Date: 2005/09/15 18:10:44 $ -- > CVS $Author: bringert $ --- > CVS $Revision: 1.1 $ +-- > CVS $Revision: 1.2 $ -- -- Graphviz DOT format representation and printing. ----------------------------------------------------------------------------- @@ -19,6 +19,8 @@ module GF.Visualization.Graphviz ( prGraphviz ) where +import Data.Char + import GF.Data.Utilities data Graph = Graph GraphType [Attr] [Node] [Edge] @@ -51,18 +53,29 @@ prNode :: Node -> String prNode (Node n at) = esc n ++ " " ++ prAttrList at prEdge :: GraphType -> Edge -> String -prEdge t (Edge x y at) = esc x ++ " " ++ edgeop t ++ " " ++ prAttrList at +prEdge t (Edge x y at) = esc x ++ " " ++ edgeop t ++ " " ++ esc y ++ " " ++ prAttrList at edgeop :: GraphType -> String edgeop Directed = "->" edgeop Undirected = "--" prAttrList :: [Attr] -> String -prAttrList = join "," . map prAttr +prAttrList [] = "" +prAttrList at = "[" ++ join "," (map prAttr at) ++ "]" prAttr :: Attr -> String prAttr (n,v) = esc n ++ " = " ++ esc v esc :: String -> String -esc s = "\"" ++ concat [ if shouldEsc c then ['\\',c] else [c] | c <- s ] ++ "\"" - where shouldEsc = (`elem` ['"', '\\']) \ No newline at end of file +esc s | needEsc s = "\"" ++ concat [ if shouldEsc c then ['\\',c] else [c] | c <- s ] ++ "\"" + | otherwise = s + where shouldEsc = (`elem` ['"', '\\']) + +needEsc :: String -> Bool +needEsc [] = True +needEsc xs | all isDigit xs = False +needEsc (x:xs) = not (isIDFirst x && all isIDChar xs) + +isIDFirst, isIDChar :: Char -> Bool +isIDFirst c = c `elem` (['_']++['a'..'z']++['A'..'Z']) +isIDChar c = isIDFirst c || isDigit c