-
-
Notifications
You must be signed in to change notification settings - Fork 5
/
color.go
94 lines (80 loc) · 2.01 KB
/
color.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package dot
import (
"fmt"
"image/color"
"sort"
"strings"
"github.com/nikolaydubina/jsonl-graph/graph"
)
type Colorer interface {
Color(k string, v interface{}) color.Color
}
// ColoredNodeLabel is label content for colorized Graphviz node
type ColoredNodeLabel struct {
n graph.NodeData
colorer Colorer
}
func (r ColoredNodeLabel) Render() string {
rows := []string{}
for k, v := range r.n {
if k == "id" || strings.HasSuffix(k, "_url") {
continue
}
row := fmt.Sprintf(`
<tr>
<td border="1" ALIGN="LEFT">%s</td>
<td border="1" ALIGN="RIGHT" bgcolor="%s">%s</td>
</tr>`,
k,
Color{c: r.colorer.Color(k, v)}.Render(),
Value{v: v}.Render(),
)
rows = append(rows, row)
}
// this will sort by key, since key is first
sort.Strings(rows)
return strings.Join(
[]string{
"<<table border=\"0\" cellspacing=\"0\" CELLPADDING=\"6\">",
fmt.Sprintf(`
<tr>
<td port="port0" border="1" colspan="2" ALIGN="CENTER" bgcolor="%s">%s</td>
</tr>`,
Color{c: color.RGBA{R: 200, G: 200, B: 200, A: 200}}.Render(),
Value{v: r.n["id"]}.Render(),
),
strings.Join(rows, "\n"),
"</table>>",
},
"\n",
)
}
// Color transforms Go color to Graphviz RGBA format which is slightly odd
type Color struct {
c color.Color
}
func (s Color) Render() string {
r, g, b, a := s.c.RGBA()
return fmt.Sprintf("#%x%x%x%x", uint8(r), uint8(g), uint8(b), uint8(a))
}
// NewColoredGraph creates renderable colored graph from graph data
func NewColoredGraph(
graph graph.Graph,
orientation Orientation,
colorer Colorer,
) BasicGraph {
nodes := make([]Renderable, 0, len(graph.Nodes))
for _, n := range graph.Nodes {
node := Node{id: n.ID(), shape: NoneShape, label: ColoredNodeLabel{n: n, colorer: colorer}}
nodes = append(nodes, node)
}
edges := make([]Renderable, 0, len(graph.Edges))
for _, e := range graph.Edges {
edges = append(edges, BasicEdge{from: e.From(), to: e.To()})
}
return BasicGraph{
orientation: orientation,
nodes: nodes,
edges: edges,
}
}