// Generated by CoffeeScript 1.10.0 (function() { var distance, margin, max_depth, width, zip; width = 1100; distance = 14; margin = 40; max_depth = 8; d3.select(self.frameElement).style('height', (2 * margin) + "px"); /* python-like zip */ zip = function() { var args, shortest; args = [].slice.call(arguments); shortest = args.length === 0 ? [] : args.reduce((function(a, b) { if (a.length < b.length) { return a; } else { return b; } })); return shortest.map((function(_, i) { return args.map(function(array) { return array[i]; }); })); }; window.main = function() { /* create the tree */ return d3.json('sized_ontology.json', function(ontology) { var Targets, diagonal, getColor, height, link, links, node, nodes, root, rsort, tcmp, tree, vis; root = ontology; root.name = "Thing"; /* sort the tree */ tcmp = function(a, b) { var ai, bi, ci, j, len, ref, ref1; ref = zip(a.children, b.children); for (j = 0, len = ref.length; j < len; j++) { ref1 = ref[j], ai = ref1[0], bi = ref1[1]; ci = tcmp(ai, bi); if (ci !== 0) { return ci; } } return b.children.length - a.children.length; }; rsort = function(t) { var c, j, len, ref; ref = t.children; for (j = 0, len = ref.length; j < len; j++) { c = ref[j]; if (c.children == null) { c.children = []; } rsort(c); } return t.children.sort(tcmp); }; rsort(root); /* initialize the layout */ tree = d3.layout.tree().size([0, 0]); nodes = tree.nodes(root); links = tree.links(nodes); height = 0; /* force the layout to display nodes in fixed rows and columns */ nodes.forEach(function(n) { if ((n.parent != null) && n.parent.children[0] !== n) { height += distance; } n.x = height; return n.y = n.depth * (width / max_depth); }); /* draw the vis */ diagonal = d3.svg.diagonal().projection(function(d) { return [d.y, d.x]; }); vis = d3.select('body').append('svg').attr('width', width).attr('height', height + 2 * margin).append('g').attr('transform', "translate(" + margin + "," + margin + ")"); link = vis.selectAll('path.link').data(links).enter().append('path').attr('class', 'link').attr('d', diagonal); node = vis.selectAll('g.node').data(nodes).enter().append('g').attr('class', 'node').attr('transform', function(d) { return "translate(" + d.y + "," + d.x + ")"; }); Targets = { 'Person': '#E14E5F', 'Organisation': '#A87621', 'Place': '#43943E', 'Work': '#AC5CC4', 'Species': '#2E99A0', 'Event': '#2986EC' }; getColor = function(d) { var flag; if (d.name === "Thing") { return '#7E7F7E'; } else if (d.name in Targets) { return Targets[d.name]; } else { flag = '#7E7F7E'; while (d.parent.name !== "Thing") { if (d.parent.name in Targets) { flag = Targets[d.parent.name]; break; } else { d = d.parent; } } return flag; } }; node.append('circle').attr('r', 5).attr('stroke', function(d) { if (d.children) { return getColor(d); } }).attr('fill', function(d) { if (!d.children) { return getColor(d); } else { return 'white'; } }); node.append('text').attr('x', function(d) { if (d.children) { return -10; } else { return 8; } }).attr('dy', 3).attr('text-anchor', function(d) { if (d.children) { return 'end'; } else { return 'start'; } }).text(function(d) { return d.name; }); /* adapt bl.ocks.org frame to the tree */ return d3.select(self.frameElement).transition().duration(500).style('height', (height + 2 * margin) + "px"); }); }; }).call(this);