| author | wenzelm |
| Wed, 25 Mar 2015 14:39:40 +0100 | |
| changeset 59812 | 675d0c692c41 |
| parent 59449 | 6d1221b590eb |
| child 60089 | 8bd5999133d4 |
| permissions | -rw-r--r-- |
| 49561 | 1 |
(* Title: Pure/General/graph_display.ML |
2 |
Author: Makarius |
|
3 |
||
|
59244
19b5fc4b2b38
more uniform support for graph display in ML/Scala;
wenzelm
parents:
59211
diff
changeset
|
4 |
Support for graph display. |
| 49561 | 5 |
*) |
6 |
||
7 |
signature GRAPH_DISPLAY = |
|
8 |
sig |
|
|
59208
2486d625878b
for graph display, prefer graph data structure over list with dependencies;
wenzelm
parents:
59207
diff
changeset
|
9 |
type node |
|
2486d625878b
for graph display, prefer graph data structure over list with dependencies;
wenzelm
parents:
59207
diff
changeset
|
10 |
val content_node: string -> Pretty.T list -> node |
|
2486d625878b
for graph display, prefer graph data structure over list with dependencies;
wenzelm
parents:
59207
diff
changeset
|
11 |
val session_node: {name: string, unfold: bool, directory: string, path: string} -> node
|
|
59210
8658b4290aed
clarified Graph_Display.graph etc.: sort_graph determines order from structure (and names);
wenzelm
parents:
59208
diff
changeset
|
12 |
type entry = (string * node) * string list |
|
59244
19b5fc4b2b38
more uniform support for graph display in ML/Scala;
wenzelm
parents:
59211
diff
changeset
|
13 |
val display_graph: entry list -> unit |
| 49561 | 14 |
end; |
15 |
||
16 |
structure Graph_Display: GRAPH_DISPLAY = |
|
17 |
struct |
|
18 |
||
|
59244
19b5fc4b2b38
more uniform support for graph display in ML/Scala;
wenzelm
parents:
59211
diff
changeset
|
19 |
(* graph entries *) |
|
59208
2486d625878b
for graph display, prefer graph data structure over list with dependencies;
wenzelm
parents:
59207
diff
changeset
|
20 |
|
|
59210
8658b4290aed
clarified Graph_Display.graph etc.: sort_graph determines order from structure (and names);
wenzelm
parents:
59208
diff
changeset
|
21 |
datatype node = |
|
8658b4290aed
clarified Graph_Display.graph etc.: sort_graph determines order from structure (and names);
wenzelm
parents:
59208
diff
changeset
|
22 |
Node of {name: string, content: Pretty.T list, unfold: bool, directory: string, path: string};
|
| 49561 | 23 |
|
|
59208
2486d625878b
for graph display, prefer graph data structure over list with dependencies;
wenzelm
parents:
59207
diff
changeset
|
24 |
fun content_node name content = |
|
59210
8658b4290aed
clarified Graph_Display.graph etc.: sort_graph determines order from structure (and names);
wenzelm
parents:
59208
diff
changeset
|
25 |
Node {name = name, content = content, unfold = true, directory = "", path = ""};
|
|
8658b4290aed
clarified Graph_Display.graph etc.: sort_graph determines order from structure (and names);
wenzelm
parents:
59208
diff
changeset
|
26 |
|
|
8658b4290aed
clarified Graph_Display.graph etc.: sort_graph determines order from structure (and names);
wenzelm
parents:
59208
diff
changeset
|
27 |
fun session_node {name, unfold, directory, path} =
|
|
8658b4290aed
clarified Graph_Display.graph etc.: sort_graph determines order from structure (and names);
wenzelm
parents:
59208
diff
changeset
|
28 |
Node {name = name, content = [], unfold = unfold, directory = directory, path = path};
|
|
8658b4290aed
clarified Graph_Display.graph etc.: sort_graph determines order from structure (and names);
wenzelm
parents:
59208
diff
changeset
|
29 |
|
|
8658b4290aed
clarified Graph_Display.graph etc.: sort_graph determines order from structure (and names);
wenzelm
parents:
59208
diff
changeset
|
30 |
type entry = (string * node) * string list; |
|
8658b4290aed
clarified Graph_Display.graph etc.: sort_graph determines order from structure (and names);
wenzelm
parents:
59208
diff
changeset
|
31 |
|
|
8658b4290aed
clarified Graph_Display.graph etc.: sort_graph determines order from structure (and names);
wenzelm
parents:
59208
diff
changeset
|
32 |
|
| 59449 | 33 |
(* encode graph *) |
34 |
||
35 |
fun encode_node (Node {name, content, ...}) =
|
|
36 |
(name, content) |> |
|
37 |
let open XML.Encode |
|
38 |
in pair string (YXML.parse_body o Pretty.symbolic_string_of o Pretty.chunks) end; |
|
39 |
||
40 |
val encode_graph = |
|
41 |
let open XML.Encode in list (pair (pair string encode_node) (list string)) end; |
|
42 |
||
43 |
||
44 |
(* support for old browser *) |
|
|
59244
19b5fc4b2b38
more uniform support for graph display in ML/Scala;
wenzelm
parents:
59211
diff
changeset
|
45 |
|
|
19b5fc4b2b38
more uniform support for graph display in ML/Scala;
wenzelm
parents:
59211
diff
changeset
|
46 |
structure Graph = |
|
59210
8658b4290aed
clarified Graph_Display.graph etc.: sort_graph determines order from structure (and names);
wenzelm
parents:
59208
diff
changeset
|
47 |
Graph(type key = string * string val ord = prod_ord string_ord string_ord); |
|
59208
2486d625878b
for graph display, prefer graph data structure over list with dependencies;
wenzelm
parents:
59207
diff
changeset
|
48 |
|
|
59244
19b5fc4b2b38
more uniform support for graph display in ML/Scala;
wenzelm
parents:
59211
diff
changeset
|
49 |
fun build_graph entries = |
|
59210
8658b4290aed
clarified Graph_Display.graph etc.: sort_graph determines order from structure (and names);
wenzelm
parents:
59208
diff
changeset
|
50 |
let |
|
8658b4290aed
clarified Graph_Display.graph etc.: sort_graph determines order from structure (and names);
wenzelm
parents:
59208
diff
changeset
|
51 |
val ident_names = |
|
8658b4290aed
clarified Graph_Display.graph etc.: sort_graph determines order from structure (and names);
wenzelm
parents:
59208
diff
changeset
|
52 |
fold (fn ((ident, Node {name, ...}), _) => Symtab.update_new (ident, (name, ident)))
|
|
59244
19b5fc4b2b38
more uniform support for graph display in ML/Scala;
wenzelm
parents:
59211
diff
changeset
|
53 |
entries Symtab.empty; |
|
59210
8658b4290aed
clarified Graph_Display.graph etc.: sort_graph determines order from structure (and names);
wenzelm
parents:
59208
diff
changeset
|
54 |
val the_key = the o Symtab.lookup ident_names; |
|
8658b4290aed
clarified Graph_Display.graph etc.: sort_graph determines order from structure (and names);
wenzelm
parents:
59208
diff
changeset
|
55 |
in |
|
59244
19b5fc4b2b38
more uniform support for graph display in ML/Scala;
wenzelm
parents:
59211
diff
changeset
|
56 |
Graph.empty |
|
19b5fc4b2b38
more uniform support for graph display in ML/Scala;
wenzelm
parents:
59211
diff
changeset
|
57 |
|> fold (fn ((ident, node), _) => Graph.new_node (the_key ident, node)) entries |
|
19b5fc4b2b38
more uniform support for graph display in ML/Scala;
wenzelm
parents:
59211
diff
changeset
|
58 |
|> fold (fn ((ident, _), parents) => |
|
19b5fc4b2b38
more uniform support for graph display in ML/Scala;
wenzelm
parents:
59211
diff
changeset
|
59 |
fold (fn parent => Graph.add_edge (the_key parent, the_key ident)) parents) entries |
|
59210
8658b4290aed
clarified Graph_Display.graph etc.: sort_graph determines order from structure (and names);
wenzelm
parents:
59208
diff
changeset
|
60 |
end; |
| 49561 | 61 |
|
|
59244
19b5fc4b2b38
more uniform support for graph display in ML/Scala;
wenzelm
parents:
59211
diff
changeset
|
62 |
val sort_graph = build_graph #> (fn graph => |
|
19b5fc4b2b38
more uniform support for graph display in ML/Scala;
wenzelm
parents:
59211
diff
changeset
|
63 |
Graph.topological_order graph |> map (fn key => |
|
19b5fc4b2b38
more uniform support for graph display in ML/Scala;
wenzelm
parents:
59211
diff
changeset
|
64 |
let val (_, (node, (preds, _))) = Graph.get_entry graph key |
|
19b5fc4b2b38
more uniform support for graph display in ML/Scala;
wenzelm
parents:
59211
diff
changeset
|
65 |
in ((#2 key, node), map #2 (Graph.Keys.dest preds)) end)); |
|
19b5fc4b2b38
more uniform support for graph display in ML/Scala;
wenzelm
parents:
59211
diff
changeset
|
66 |
|
|
59210
8658b4290aed
clarified Graph_Display.graph etc.: sort_graph determines order from structure (and names);
wenzelm
parents:
59208
diff
changeset
|
67 |
val encode_browser = |
| 59449 | 68 |
sort_graph |
69 |
#> map (fn ((key, Node {name, unfold, content = _, directory, path}), parents) =>
|
|
|
59208
2486d625878b
for graph display, prefer graph data structure over list with dependencies;
wenzelm
parents:
59207
diff
changeset
|
70 |
"\"" ^ name ^ "\" \"" ^ key ^ "\" \"" ^ directory ^ (if unfold then "\" + \"" else "\" \"") ^ |
|
59210
8658b4290aed
clarified Graph_Display.graph etc.: sort_graph determines order from structure (and names);
wenzelm
parents:
59208
diff
changeset
|
71 |
path ^ "\" > " ^ space_implode " " (map quote parents) ^ " ;") |
|
8658b4290aed
clarified Graph_Display.graph etc.: sort_graph determines order from structure (and names);
wenzelm
parents:
59208
diff
changeset
|
72 |
#> cat_lines; |
|
50715
8cfd585b9162
prefer old graph browser in Isabelle/jEdit, which still produces better layout;
wenzelm
parents:
50450
diff
changeset
|
73 |
|
|
49565
ea4308b7ef0f
ML support for generic graph display, with browser and graphview backends (via print modes);
wenzelm
parents:
49561
diff
changeset
|
74 |
|
| 49561 | 75 |
(* display graph *) |
76 |
||
| 59449 | 77 |
fun display_graph entries = |
78 |
let |
|
79 |
val ((bg1, bg2), en) = |
|
80 |
YXML.output_markup_elem |
|
81 |
(Active.make_markup Markup.graphviewN {implicit = false, properties = []});
|
|
82 |
val _ = |
|
83 |
writeln ("See " ^ bg1 ^ YXML.string_of_body (encode_graph entries) ^ bg2 ^ "graph" ^ en);
|
|
| 59285 | 84 |
|
| 59449 | 85 |
(*old browser*) |
86 |
val ((bg1, bg2), en) = |
|
87 |
YXML.output_markup_elem |
|
88 |
(Active.make_markup Markup.browserN {implicit = false, properties = []});
|
|
89 |
val _ = |
|
90 |
writeln ("See " ^ bg1 ^ encode_browser entries ^ bg2 ^ "old graph" ^ en);
|
|
91 |
in () end; |
|
| 49561 | 92 |
|
93 |
end; |