displayDependencyGraph.hs revision 98890889ffb2e8f6f722b00e265a211f13b5a861
4169N/A{- |
1178N/AModule : $Header$
1178N/ADescription : create a slightly faked dependency graph of the hets directories
1178N/ACopyright : (c) jianchun wang and Uni Bremen 2006
1178N/ALicense : GPLv2 or higher, see LICENSE.txt
1178N/A
1178N/AMaintainer : Christian.Maeder@dfki.de
1178N/AStability : provisional
1178N/APortability : portable
1178N/A
1178N/Ain order to generate the graph, hets needs to be created with
1178N/A-ddump-minimal-imports first. Start the GUI\/displayDependencyGraph
1178N/Abinary that reads in the .imports files in the top-level directory and
1178N/Asave the graph as postscript possibly after moving some edges and
1178N/Anodes. Suitably convert the postscript file to a .png file and upload
1178N/Ait.
1178N/A
2362N/AIf the graph contains cycles exclude suitable modules in 'exclude'.
2362N/A
2362N/A* File, Print..., Page Size A3, Fit to Page, Send to: File
1178N/A
4169N/A* convert -rotate 90 graph.ps graph.png
1178N/A
1178N/A
4033N/A-}
4033N/A
0N/Amodule Main where
0N/A
1178N/A-- for graph display
1178N/Aimport UDrawGraph.Graph
4033N/Aimport Graphs.GraphDisp
1178N/Aimport Graphs.GraphConfigure
1178N/A
4033N/A-- for windows display
1178N/Aimport HTk.Toolkit.TextDisplay
1178N/Aimport HTk.Kernel.Configuration (size)
4033N/Aimport Events.Events (sync)
1178N/Aimport Events.Destructible (destroy, destroyed)
1178N/Aimport qualified HTk.Toplevel.HTk as HTk
4033N/A
1178N/Aimport qualified Data.Map as Map
1178N/Aimport qualified Data.Set as Set
4033N/Aimport qualified Common.Lib.Rel as Rel
1178N/A
1178N/Aimport System.Directory
4033N/Aimport Data.List
1178N/A
0N/Amain :: IO ()
0N/Amain = do
4033N/A fs <- getDirectoryContents "."
0N/A let suf = ".imports"
0N/A fn = filter (isSuffixOf suf) fs
1178N/A ffn = map ( \ s -> take (length s - length suf) s) fn
1178N/A ffnn = filter exclude $ filter (elem '.') ffn
0N/A fln = map (fst . break (== '.')) ffnn
4033N/A fln' = nub fln
0N/A lfs <- mapM (readFile . (++ suf)) ffnn
1178N/A let ss = map (filter (isPrefixOf "import") . lines) lfs
1178N/A sss = getContent6 ss
1178N/A ssss' = map (filter exclude) sss
4033N/A ssss = map (map $ fst . break (== '.')) ssss'
1178N/A sss' = map nub ssss
1178N/A graphParms = GraphTitle "Dependency Graph" $$
4033N/A OptimiseLayout True $$
1178N/A AllowClose (return True) $$
1178N/A emptyGraphParms
4033N/A wishInst <- HTk.initHTk [HTk.withdrawMainWin]
1178N/A depG <- newGraph daVinciSort graphParms
1178N/A let flln = nub $ fln' ++ concat sss'
0N/A subNodeMenu = LocalMenu (Menu (Just "Info") [
4033N/A Button "Contents" (\lg -> createTextDisplay
0N/A ("Contents of " ++ lg)
1178N/A (showCon lg) [size(80,25)])])
4033N/A showCon lg = unlines (filter (isPrefixOf (lg++".")) ffnn)
1178N/A subNodeTypeParms =
1178N/A subNodeMenu $$$
4033N/A Ellipse $$$
1178N/A ValueTitle return $$$
1178N/A Color "yellow" $$$
4033N/A emptyNodeTypeParms
1178N/A subNodeType <- newNodeType depG subNodeTypeParms
1178N/A subNodeList <- mapM (newNode depG subNodeType) flln
1178N/A let slAndNodes = Map.fromList $ zip flln subNodeList
1178N/A lookup' g_sl = Map.findWithDefault
1178N/A (error "lookup': node not found")
4033N/A g_sl slAndNodes
1178N/A subArcMenu = LocalMenu( Menu Nothing [])
4033N/A subArcTypeParms = subArcMenu $$$
1178N/A ValueTitle id $$$
1178N/A Color "green" $$$
0N/A emptyArcTypeParms
0N/A subArcType <- newArcType depG subArcTypeParms
0N/A let insertSubArc (node1, node2) =
4033N/A newArc depG subArcType (return "")
0N/A (lookup' node1)
0N/A (lookup' node2)
1178N/A mapM_ insertSubArc $
0N/A Rel.toList $ Rel.intransKernel $ Rel.transClosure $
0N/A Rel.fromList
0N/A $ isIn3 $ concat $ zipWith getContent2 fln sss'
0N/A redraw depG
0N/A sync(destroyed depG)
0N/A destroy wishInst
0N/A HTk.finishHTk
0N/A
4033N/Aexclude :: String -> Bool
0N/Aexclude s = not
0N/A $ isPrefixOf "ATC." s || isPrefixOf ".ATC_" (dropWhile (/= '.') s)
0N/A || Set.member s (Set.fromList
0N/A [ "Isabelle.CreateTheories"
0N/A , "CspCASLProver.Utils", "CspCASLProver.IsabelleUtils"
1178N/A , "CspCASLProver.TransProcesses", "CspCASLProver.CspCASLProver"
0N/A , "CASL.QuickCheck"
4033N/A , "OWL.StructureAnalysis", "OWL.OWLAnalysis"
4033N/A , "OWL.ProvePellet", "OWL.ProveFact"
0N/A , "Proofs.InferBasic", "Proofs.BatchProcessing"
0N/A , "Comorphisms.GetPreludeLib"
4033N/A , "Maude.Maude2DG", "Maude.PreComorphism"
4033N/A , "Haskell.Haskell2DG", "Haskell.CreateModules"
0N/A , "Comorphisms.KnownProvers", "Comorphisms.LogicGraph"
4033N/A , "Interfaces.GenericATPState"
4033N/A , "GUI.Utils", "GUI.Taxonomy"
0N/A , "Driver.Options" -- Static
0N/A , "GUI.GenericATP", "SoftFOL.CreateDFGDoc"
0N/A , "SoftFOL.MathServMapping", "SoftFOL.ProveMathServ"
0N/A , "SoftFOL.ProveDarwin", "SoftFOL.ProveSPASS"
4033N/A , "SoftFOL.ProveVampire", "SoftFOL.ProverState"
0N/A , "Taxonomy.MMiSSOntologyGraph"
0N/A , "Propositional.Prop2CNF", "Propositional.Prop2CASLHelpers"
0N/A , "Propositional.Prove"
0N/A , "Modifications.ModalEmbedding"
0N/A , "Static.AnalysisLibrary", "Static.WACocone"
4033N/A , "OMDoc.OMDocDefs", "OMDoc.OMDocOutput", "OMDoc.DataTypes"
1178N/A , "OMDoc.Export", "OMDoc.Sentences"
4033N/A , "OMDoc.OMDocInput", "OMDoc.HetsDefs", "Debug.Trace"
0N/A ])
0N/A
4033N/AgetContent2 :: String -> [String] -> [(String, String)]
0N/AgetContent2 x = map (\ m -> (x, m))
0N/A
4033N/AgetContent4 :: [String] -> [String]
0N/AgetContent4 = map ((!! 1) . words)
0N/A
4033N/AgetContent5 :: [String] -> [String]
0N/AgetContent5 = map $ fst . break (== '(')
0N/A
0N/AgetContent6 :: [[String]] ->[[String]]
0N/AgetContent6 = map $ filter (elem '.') . getContent5 . getContent4
4033N/A
4033N/AisIn3 :: (Eq a) => [(a, a)] -> [(a, a)]
0N/AisIn3 = filter $ uncurry (/=)
0N/A