// Generated by CoffeeScript 1.10.0 (function() { var checked, colors, distance, margin, max_depth, redraw, svg, tree_url, vis, width, zip, indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; width = 1100; distance = 16; margin = 40; max_depth = 7; tree_url = 'tree.jsonld'; colors = { core: '#b2182b', bib: '#2166ac', auto: '#1b7837' }; checked = ['core']; 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]; }); })); }; svg = d3.select('body').append('svg'); vis = svg.append('g'); redraw = function() { return d3.json(tree_url, function(data) { var diagonal, enter_ex, extensions, extensions_data, filter_tree, height, link, links, mouseout, mouseover, node, node_enter, nodes, root, rsort, subtable, tcmp, tree; root = data; root.name = "Thing"; extensions_data = []; filter_tree = function(t) { var c, i, indexes, j, l, len, len1, ref, ref1, ref2, ref3, results; indexes = []; if (t.children != null) { ref = t.children; for (i = j = 0, len = ref.length; j < len; i = ++j) { c = ref[i]; if ((ref1 = c.layer, indexOf.call(extensions_data, ref1) < 0) && c.layer !== 'core') { extensions_data.push(c.layer); } if (ref2 = c.layer, indexOf.call(checked, ref2) < 0) { indexes.push(i); continue; } filter_tree(c); } ref3 = indexes.reverse(); results = []; for (l = 0, len1 = ref3.length; l < len1; l++) { i = ref3[l]; results.push(t.children.splice(i, 1)); } return results; } }; 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, i, j, len, ref; ref = t.children; for (i = j = 0, len = ref.length; j < len; i = ++j) { c = ref[i]; if (c.children == null) { c.children = []; } rsort(c); } return t.children.sort(tcmp); }; rsort(root); filter_tree(root); tree = d3.layout.tree().size([0, 0]); nodes = tree.nodes(root); links = tree.links(nodes); height = 0; nodes.forEach(function(n, i) { if ((n.parent != null) && n.parent.children[0] !== n) { height += distance; } if (i > 0 && nodes[i - 1].depth > n.depth) { height += 25; } n.x = height; return n.y = n.depth * (width / max_depth); }); extensions = d3.select('#extensions').selectAll('.extension').data(extensions_data); enter_ex = extensions.enter().append('span'); enter_ex.append('input').attr({ "class": 'extension', value: function(d) { return d; }, type: 'checkbox', name: 'extension' }).on('change', function(d) { if (this.checked) { checked.push(d); } else { checked.splice(checked.indexOf(d), 1); } return redraw(); }); enter_ex.append('span').text(function(d) { return d; }); diagonal = d3.svg.diagonal().projection(function(d) { return [d.y, d.x]; }); svg.attr('width', width).attr('height', height + 2 * margin); vis.attr('transform', "translate(" + margin + "," + margin + ")"); link = vis.selectAll('path.link').data(links); link.enter().append('path').attr('class', 'link'); link.attr('d', diagonal); link.exit().remove(); subtable = function(key, obj) { var k, ref, str, v; str = "<table>"; ref = obj[key]; for (k in ref) { v = ref[k]; if (v instanceof Object) { str += "<tr><td class='key'>" + k + "</td><td class='value'>" + subtable(k, obj[key]) + "</td></tr>"; } else { str += "<tr><td class='key'>" + k + "</td><td class='value'>" + v + "</td></tr>"; } } return str + "</table>"; }; mouseover = function(d) { var kv, table; d3.select('#infobox').style({ display: 'inline', top: (event.pageY + 25) + "px", left: event.pageX + "px" }); table = d3.select('#infobox table'); kv = table.selectAll('.key_value').data(Object.keys(d).filter(function(k) { return k !== 'children' && k !== 'parent' && k !== 'x' && k !== 'y'; }).sort()); kv.enter().append('tr').attr({ "class": 'key_value' }); kv.append('td').attr({ "class": 'key' }).text(function(k) { return "" + k; }); return kv.append('td').attr({ "class": 'value' }).html(function(k) { if (k === '@context') { return subtable(k, d); } else { return "" + d[k]; } }); }; mouseout = function() { d3.select('#infobox').style('display', 'none'); return d3.select('#infobox table').html(''); }; node = vis.selectAll('g.node').data(nodes, function(d) { return d['@id']; }); node_enter = node.enter().append('g').attr('class', 'node'); node.attr('transform', function(d) { return "translate(" + d.y + "," + d.x + ")"; }); node_enter.append('circle').attr({ r: 5, stroke: function(d) { if (d.children) { return colors[d.layer]; } }, fill: function(d) { if (!d.children) { return colors[d.layer]; } else { return 'white'; } } }); node_enter.append('a').attr({ "class": 'class', 'xlink:href': function(d) { return 'http://schema.org/' + d.name; } }).on('mouseover', mouseover).on('mouseout', mouseout).append('text').attr({ x: function(d) { if (d.children) { return -9; } else { return 8; } }, dy: function(d) { if (d.children) { return -2; } else { return 3; } }, 'text-anchor': function(d) { if (d.children) { return 'end'; } else { return 'start'; } } }).text(function(d) { return d.name; }); node.exit().remove(); /* adapt bl.ocks.org frame to the tree */ return d3.select(self.frameElement).transition().duration(500).style('height', (height + 2 * margin) + "px"); }); }; redraw(); }).call(this);