@@ -15,18 +15,42 @@ module ApplicationHelper |
||
| 15 | 15 |
end |
| 16 | 16 |
end |
| 17 | 17 |
|
| 18 |
- def render_dot(dot_format_string) |
|
| 18 |
+ def render_agents_diagram(agents) |
|
| 19 | 19 |
if (command = ENV['USE_GRAPHVIZ_DOT']) && |
| 20 | 20 |
(svg = IO.popen([command, *%w[-Tsvg -q1 -o/dev/stdout /dev/stdin]], 'w+') { |dot|
|
| 21 |
- dot.print dot_format_string |
|
| 21 |
+ dot.print agents_dot(agents, true) |
|
| 22 | 22 |
dot.close_write |
| 23 | 23 |
dot.read |
| 24 | 24 |
} rescue false) |
| 25 | 25 |
svg.html_safe |
| 26 | 26 |
else |
| 27 | 27 |
tag('img', src: URI('https://chart.googleapis.com/chart').tap { |uri|
|
| 28 |
- uri.query = URI.encode_www_form(cht: 'gv', chl: dot_format_string) |
|
| 28 |
+ uri.query = URI.encode_www_form(cht: 'gv', chl: agents_dot(agents)) |
|
| 29 | 29 |
}) |
| 30 | 30 |
end |
| 31 | 31 |
end |
| 32 |
+ |
|
| 33 |
+ private |
|
| 34 |
+ |
|
| 35 |
+ def dot_id(string) |
|
| 36 |
+ # Backslash escaping seems to work for the backslash itself, |
|
| 37 |
+ # despite the DOT language document. |
|
| 38 |
+ '"%s"' % string.gsub(/\\/, "\\\\\\\\").gsub(/"/, "\\\\\"") |
|
| 39 |
+ end |
|
| 40 |
+ |
|
| 41 |
+ def agents_dot(agents, rich = false) |
|
| 42 |
+ "digraph foo {".tap { |dot|
|
|
| 43 |
+ agents.each.with_index do |agent, index| |
|
| 44 |
+ if rich |
|
| 45 |
+ dot << '%s[URL=%s];' % [dot_id(agent.name), dot_id(agent_path(agent.id))] |
|
| 46 |
+ else |
|
| 47 |
+ dot << '%s;' % dot_id(agent.name) |
|
| 48 |
+ end |
|
| 49 |
+ agent.receivers.each do |receiver| |
|
| 50 |
+ dot << "%s->%s;" % [dot_id(agent.name), dot_id(receiver.name)] |
|
| 51 |
+ end |
|
| 52 |
+ end |
|
| 53 |
+ dot << "}" |
|
| 54 |
+ } |
|
| 55 |
+ end |
|
| 32 | 56 |
end |
@@ -9,17 +9,7 @@ |
||
| 9 | 9 |
</div> |
| 10 | 10 |
|
| 11 | 11 |
<div class='digraph'> |
| 12 |
- <% |
|
| 13 |
- dot_format_string = "digraph foo {"
|
|
| 14 |
- @agents.each.with_index do |agent, index| |
|
| 15 |
- dot_format_string += "\"#{agent.name}\";"
|
|
| 16 |
- agent.receivers.each do |receiver| |
|
| 17 |
- dot_format_string += "\"#{agent.name}\"->\"#{receiver.name}\";"
|
|
| 18 |
- end |
|
| 19 |
- end |
|
| 20 |
- dot_format_string = dot_format_string + "}" |
|
| 21 |
- %> |
|
| 22 |
- <%= render_dot(dot_format_string) %> |
|
| 12 |
+ <%= render_agents_diagram(@agents) %> |
|
| 23 | 13 |
</div> |
| 24 | 14 |
</div> |
| 25 | 15 |
</div> |