1 function PieDrawer(selector) {
2 this.selector = selector;
5 PieDrawer.height = 150;
6 PieDrawer.radius = Math.min(PieDrawer.width, PieDrawer.height) / 2;
7 PieDrawer.formatPercent = d3.format(".2%");
9 PieDrawer.color_nos_oignons = "#ffa430";
10 PieDrawer.color_others = "#57075f";
12 PieDrawer.arc = d3.svg.arc()
13 .outerRadius(PieDrawer.radius - 10)
14 .innerRadius(PieDrawer.radius - 40);
16 PieDrawer.labelRadius = PieDrawer.radius - 15;
18 PieDrawer.pie = d3.layout.pie()
20 .value(function(d) { return d.frac; });
22 PieDrawer.onionoo_url = "https://onionoo.torproject.org/details?type=relay&contact=%20%20%20%200x9F29C15D42A8B6F3%20Nos%20oignons%20-%2017WLwtW63FrHeMAEVkALnwhfmizBxGXDW1%20email:adminsys[]nos-oignons.net%20url:https://nos-oignons.net%20proof:uri-rsa%20ciissversion:2";
25 PieDrawer.prototype.getFieldName = undefined;
26 PieDrawer.prototype.getField = undefined;
27 PieDrawer.prototype.draw = function() {
28 var svg = d3.select(this.selector).append("svg")
29 .style("margin", "auto")
30 .attr("width", PieDrawer.width)
31 .attr("height", PieDrawer.height)
33 .attr("transform", "translate(" + PieDrawer.width / 2 + "," + PieDrawer.height / 2 + ")");
35 var text = svg.append("text")
36 .attr("text-anchor", "middle")
40 var field_getter = this.getField;
41 d3.json(PieDrawer.onionoo_url + "&fields=fingerprint," + this.getFieldName(), function(error, raw_data) {
42 var frac_nos_oignons = 0;
43 raw_data['relays'].forEach(function(d) {
44 nos_oignons_relays.forEach(function(r) {
45 if (r.fingerprint == d.fingerprint) {
46 var value = field_getter(d);
48 frac_nos_oignons += value;
53 var frac_others = 1 - frac_nos_oignons;
55 data = [ { name: L10n.nos_oignons, frac: frac_nos_oignons, color: PieDrawer.color_nos_oignons, },
56 { name: L10n.others, frac: frac_others, color: PieDrawer.color_others }, ];
58 text.text(PieDrawer.formatPercent(data[0].frac));
60 var g = svg.selectAll(".arc")
61 .data(PieDrawer.pie(data))
63 .attr("class", "arc");
66 .attr("d", PieDrawer.arc)
67 .style("fill", function(d) { return d.data.color; });
72 function ConsensusPieDrawer(selector) {
73 this.selector = selector;
75 ConsensusPieDrawer.prototype = new PieDrawer();
76 ConsensusPieDrawer.prototype.getSelector = function() {
77 return "#consensus-pie";
79 ConsensusPieDrawer.prototype.getFieldName = function() {
80 return "consensus_weight_fraction";
82 ConsensusPieDrawer.prototype.getField = function(r) {
83 return r.consensus_weight_fraction;
86 function ExitPieDrawer(selector) {
87 this.selector = selector;
89 ExitPieDrawer.prototype = new PieDrawer();
90 ExitPieDrawer.prototype.getFieldName = function() {
91 return "exit_probability";
93 ExitPieDrawer.prototype.getField = function(r) {
94 return r.exit_probability;