forked from abcnews/d3-layout-narrative
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathnarrative.min.js
1 lines (1 loc) · 11.8 KB
/
narrative.min.js
1
d3.layout.narrative=function(){function a(){function a(a){var b={};return a.forEach(function(a){b[a]=!0}),Object.keys(b)}function b(a){var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(a[c]);return b}function c(a,b){var c=a._assoc_mat[b]?Object.keys(a._assoc_mat[b]):[],d=0;return c.forEach(function(c){var e=a._assoc_mat[b][c]||1;b===c&&(e*=2),d+=e}),d}function d(a,b){if("undefined"==typeof a._assoc_mat[b])return[];var c=Object.keys(a._assoc_mat[b]);return c}function e(a,b,c){return a._assoc_mat[b]?a._assoc_mat[b][c]:void 0}function f(a){var b=0;return a.edges.forEach(function(a){b+=a.weight}),b}function g(a,b){i(a,b);var c=a.edges.map(function(a){return a.source+"_"+a.target}).indexOf(b.source+"_"+b.target);-1!==c?a.edges[c].weight=b.weight:a.edges.push(b)}function h(a){var b={};return a.forEach(function(a){b[a.source]=b[a.source]||{},b[a.source][a.target]=a.weight,b[a.target]=b[a.target]||{},b[a.target][a.source]=a.weight}),b}function i(a,b){a._assoc_mat[b.source]=a._assoc_mat[b.source]||{},a._assoc_mat[b.source][b.target]=b.weight,a._assoc_mat[b.target]=a._assoc_mat[b.target]||{},a._assoc_mat[b.target][b.source]=b.weight}function j(a){if(null===a||"object"!=typeof a)return a;var b=a.constructor();for(var c in a)b[c]=j(a[c]);return b}function k(a,b,g){b.nodes_to_com={},b.total_weight=0,b.internals={},b.degrees={},b.gdegrees={},b.loops={},b.total_weight=f(a),a.nodes.forEach("undefined"==typeof g?function(d,f){b.nodes_to_com[d]=f;var g=c(a,d);if(0>g)throw"Bad graph type, use positive weights!";b.degrees[f]=g,b.gdegrees[d]=g,b.loops[d]=e(a,d,d)||0,b.internals[f]=b.loops[d]}:function(e){var f=g[e];b.nodes_to_com[e]=f;var h=c(a,e);b.degrees[f]=(b.degrees[f]||0)+h,b.gdegrees[e]=h;var i=0,j=d(a,e);j.forEach(function(b){var c=a._assoc_mat[e][b];if(0>=c)throw"Bad graph type, use positive weights";g[b]===f&&(i+=b===e?c:c/2)}),b.internals[f]=(b.internals[f]||0)+i})}function l(c){var d=c.total_weight,e=0,f=a(b(c.nodes_to_com));return f.forEach(function(a){var b=c.internals[a]||0,f=c.degrees[a]||0;d>0&&(e=e+b/d-Math.pow(f/(2*d),2))}),e}function m(a,b,c){var e={},f=d(b,a);return f.forEach(function(d){if(d!==a){var f=b._assoc_mat[a][d]||1,g=c.nodes_to_com[d];e[g]=(e[g]||0)+f}}),e}function n(a,b,c,d){d.nodes_to_com[a]=+b,d.degrees[b]=(d.degrees[b]||0)+(d.gdegrees[a]||0),d.internals[b]=(d.internals[b]||0)+c+(d.loops[a]||0)}function o(a,b,c,d){d.degrees[b]=(d.degrees[b]||0)-(d.gdegrees[a]||0),d.internals[b]=(d.internals[b]||0)-c-(d.loops[a]||0),d.nodes_to_com[a]=-1}function p(a){var b=0,c=j(a),d={},e=Object.keys(a);return e.forEach(function(e){var f=a[e],g="undefined"==typeof d[f]?-1:d[f];-1===g&&(d[f]=b,g=b,b+=1),c[e]=g}),c}function q(a,b){function c(c){var e=b.nodes_to_com[c],f=(b.gdegrees[c]||0)/(2*b.total_weight),g=m(c,a,b);o(c,e,g[e]||0,b);var h=e,i=0,j=Object.keys(g);j.forEach(function(a){var c=g[a]-(b.degrees[a]||0)*f;c>i&&(i=c,h=a)}),n(c,h,g[h]||0,b),h!==e&&(d=!0)}for(var d=!0,e=0,f=l(b),g=f;d&&e!==x&&(f=g,d=!1,e+=1,a.nodes.forEach(c),g=l(b),!(y>g-f)););}function r(c,d){var f,h,i={nodes:[],edges:[],_assoc_mat:{}},j=b(c);return i.nodes=i.nodes.concat(a(j)),d.edges.forEach(function(a){h=a.weight||1;var b=c[a.source],d=c[a.target];f=e(i,b,d)||0;var j=f+h;g(i,{source:b,target:d,weight:j})}),i}function s(a,b){function c(b){var c=b,f=d[b];d[c]=a[e][f]}for(var d=j(a[0]),e=1;b+1>e;e++)Object.keys(d).forEach(c);return d}function t(a,b){if(0===a.edges.length){var c={};return a.nodes.forEach(function(a){c[a]=a}),c}var d={};k(z,d,b);var e=l(d),f=[];q(z,d);var g=l(d),h=p(d.nodes_to_com);f.push(h),e=g;var i=r(h,z);for(k(i,d);;){if(q(i,d),g=l(d),y>g-e)break;h=p(d.nodes_to_com),f.push(h),e=g,i=r(h,i),k(i,d)}return f}var u,v,w,x=-1,y=1e-7,z={},A=function(){var a=t(z,w);return s(a,a.length-1)};return A.nodes=function(a){return arguments.length>0&&(u=a),A},A.edges=function(a){if("undefined"==typeof u)throw"Please provide the graph nodes first!";if(arguments.length>0){v=a;var b=h(a);z={nodes:u,edges:v,_assoc_mat:b}}return A},A.partition_init=function(a){return arguments.length>0&&(w=a),A},A}function b(){function a(a){var d,e;return d=b.reduce(function(b,c){return a.character===c.character&&b[0]++,a.scene===c.scene&&b[1]++,b},[0,0]),e=d[0]>=1&&d[1]>=1,c=c&&e,e}var b,c;for(b=[],u.forEach(function(a){a.characters.forEach(function(c){c="object"==typeof c?c:v[c],c._x=c.x||!1,c._y=c.y||!1,c._width=c.width||!1,c._height=c.height||!1,b.push({character:c,scene:a}),a.appearances=[],a.bounds=r,c.appearances=[]}),a._x=a.x||!1,a._y=a.y||!1});!c;)c=!0,b=b.filter(a);v=[],u=[],b.forEach(function(a){a.scene.appearances.push(a),a.character.appearances.push(a),-1===v.indexOf(a.character)&&v.push(a.character),-1===u.indexOf(a.scene)&&u.push(a.scene)})}function c(){function b(a){var b,c,d;for(d=[],b=a.length;b--;)for(c=b;c--;)d.push([v.indexOf(a[b].character),v.indexOf(a[c].character)]);return d}var c,d,e,f,g,h;c=v.map(function(a,b){return b}),h=v.reduce(function(a,b,c){return b.initialgroup&&(a[c]=+b.initialgroup),a},{}),d=[],u.forEach(function(a){d=d.concat(b(a.appearances))}),d=d.reduce(function(a,b){var c;return c=a.filter(function(a){return!(a.target!==b[0]&&a.target!==b[1]||a.source!==b[0]&&a.source!==b[1])})[0]||{source:b[0],target:b[1],weight:0},c.weight++,1===c.weight&&a.push(c),a},[]),f=a().nodes(c).edges(d),h&&f.partition_init(h),e=f(),G=[],g={},v.forEach(function(a,b){var c,d;c=e[b],d=g[c],d||(d={id:c,characters:[]},G.push(d),g[c]=d),d.characters.push(a),a.group=d})}function d(){u.forEach(function(a){var b,c,d;b=[],c={},a.appearances.forEach(function(a){var d,e;e=G.indexOf(a.character.group),d=c[e],d||(d={groupIndex:e,count:0},c[e]=d,b.push(d)),d.count++}),b.sort(function(a,b){return a.count-b.count}),d=G[b.pop().groupIndex],d.medianCount=d.medianCount||0,d.medianCount++,a.group=d})}function e(){u.forEach(function(a){var b;b=a.appearances.map(function(a){return a.character}),a.group.appearances=a.group.appearances||[],a.group.appearances=a.group.appearances.concat(b.filter(function(b){return-1===a.group.appearances.indexOf(b)}))})}function f(){var a,b,c,d;for(G.sort(function(a,b){return b.medianCount-a.medianCount}),b=[],d=0;G.length;)c=a?G.pop():G.shift(),c.order=d,d++,b.push(c),a=!a;G=b}function g(){var a;a=0,G.forEach(function(b){b.min=a,b.max=a=q(b.appearances.length)+b.min,a+=E})}function h(){v.forEach(function(a){var b,c;b=c=0,a.appearances.forEach(function(a){c++,b+=G.indexOf(a.scene.group)}),a.averageScenePosition=b/c}),G.forEach(function(a){a.characters.sort(function(a,b){var c;return c=a.averageScenePosition-b.averageScenePosition,0!==c?c:v.indexOf(a)-v.indexOf(b)})})}function i(){G.forEach(function(a){a.appearances.sort(function(a,b){var c;return c=a.group.order-b.group.order,0!==c?c:(c=a.averageScenePosition-b.averageScenePosition,0!==c?c:v.indexOf(a)-v.indexOf(b))})})}function j(){var a=1;u.forEach(function(b){b.start=b.start||a,b.duration=b.duration||1,a+=b.duration}),B=("vertical"===z?y[1]-C[1]:y[0]-C[0])/a}function k(){u.forEach(function(a){a.appearances.sort(function(a,b){var c;return c=a.character.group.order-b.character.group.order,0!==c?c:(c=a.character.averageScenePosition-b.character.averageScenePosition,0!==c?c:v.indexOf(a.character)-v.indexOf(b.character))}),a.appearances.forEach(function(a,b){"vertical"===z?(a.y=F[0],a.x=p(b)+F[3]):(a.y=p(b)+F[0],a.x=F[3])})})}function l(){u.forEach(function(a){var b,c,d;a.height=q(a.appearances.length)+F[0]+F[2],a.width=F[1]+F[3],d=a.appearances.filter(function(b){return b.character.group!==a.group}),d.length||(d=a.appearances),b=d.reduce(function(b,c){return b+=p(a.group.appearances.indexOf(c.character))+a.group.min},0),c=b/d.length,"vertical"===z?(a.x=a._x||Math.max(0,Math.min(y[0],c-a.width/2)),a.y=a._y||Math.max(0,Math.min(y[1],B*a.start+C[1]))):(a.x=a._x||Math.max(0,Math.min(y[0],B*a.start+C[0])),a.y=a._y||Math.max(0,Math.min(y[1],c-a.height/2)))})}function m(){var a;a=v.map(function(a){return a.appearances[0]}),w=[],a.forEach(function(a){var b,c,d;b={character:a.character,bounds:s},"vertical"===z?(c=a.scene.x+a.x,d=a.scene.y-.5*B):(c=a.scene.x-.5*B,d=a.scene.y+a.y,c-C[0]<C[0]&&(c=C[0])),"vertical"===z?(b.x=a.character._x||Math.max(0+C[0]/2,Math.min(y[0]-C[0]/2,c)),b.y=a.character._y||Math.max(0,Math.min(y[1]-C[1],d))):(b.x=a.character._x||Math.max(0,Math.min(y[0]-C[0],c)),b.y=a.character._y||Math.max(0+C[1]/2,Math.min(y[1]-C[1]/2,d))),b.width=a.character._width||C[0],b.height=a.character._height||C[1],a.character.introduction=b,w.push(b)})}function n(){function a(a){function b(b){b.y+=a.bounds()[1][1]-b.bounds()[0][1]}var f,g,h,i,j,k,l;if(k=e(a),k&&(l=k.filter(function(a){return a.character}),l.forEach(b),k=k.filter(function(a){return!a.character})))for(g=d(k),h=a.bounds(),j=a.y,f=[g[1][1]-h[0][1],g[0][1]-h[1][1]],f.sort(function(a,b){return Math.abs(a)-Math.abs(b)});(i=f.shift())&&(a.y+=i,k=e(a));){if(i>0&&k.every(c)){k.forEach(b);break}a.y=j}}function b(a){function b(b){b.y+=a.bounds()[1][1]-b.bounds()[0][1]}var f,g,h,i,j,k,l;if(k=e(a),k&&(l=k.filter(function(a){return a.character}),l.forEach(b),k=k.filter(function(a){return!a.character})))for(g=d(k),h=a.bounds(),j=a.y,f=[g[1][1]-h[0][1],g[0][1]-h[1][1]],f.sort(function(a,b){return Math.abs(a)-Math.abs(b)});(i=f.shift())&&(a.y+=i,k=e(a));){if(i>0&&k.every(c)){k.forEach(b);break}a.y=j}}function c(a){return a.character}function d(a){var b,c,d,e;return b=d3.min(a,function(a){return a.bounds()[0][0]}),c=d3.max(a,function(a){return a.bounds()[1][0]}),d=d3.min(a,function(a){return a.bounds()[0][1]}),e=d3.max(a,function(a){return a.bounds()[1][1]}),[[b,d],[c,e]]}function e(a){var b,c,d;for(d=[],b=0,c=g.length;c>b;b++)a!==g[b]&&f(a.bounds(),g[b].bounds())&&d.push(g[b]);return d.length?d:!1}function f(a,b){return!(a[1][0]<=b[0][0]||b[1][0]<=a[0][0]||a[1][1]<=b[0][1]||b[1][1]<=a[0][1])}var g,h;g=w.concat(u),h=w.slice(),h.sort(function(a,b){return a.y-b.y}),h.forEach("vertical"===z?b:a)}function o(){x=[],v.forEach(function(a){var b;for(x.push({character:a,source:a.introduction,target:a.appearances[0]}),b=1;b<a.appearances.length;b++)x.push({character:a,source:a.appearances[b-1],target:a.appearances[b]})})}function p(a){return a*A+A/2}function q(a){return p(a)-A/2}function r(){return[[this.x,this.y],[this.x+this.width,this.y+this.height]]}function s(){switch(D){case"left":return[[this.x-this.width,this.y-this.height/2],[this.x,this.y+this.height/2]];case"above":return[[this.x-this.width/2,this.y-this.height],[this.x+this.width/2,this.y]];case"right":return[[this.x,this.y-this.height/2],[this.x+this.width,this.y+this.height/2]];case"below":return[[this.x-this.width/2,this.y],[this.x+this.width/2,this.y+this.height]]}}var t,u,v,w,x,y,z,A,B,C,D,E,F,G;return y=[1,1],B=1,A=10,C=[100,15],D="right",F=[0,0,0,0],E=0,z="horizontal",t={},t.scenes=function(a){return arguments.length?(u=a,t):u},t.characters=function(a){return arguments.length?(v=a,t):v},t.size=function(a){return arguments.length?(y=a,t):y},t.orientation=function(a){return arguments.length?(z=a,t):z},t.extent=function(){return u.concat(w).reduce(function(a,b){var c=b.bounds();return c[1][1]>a[1]&&(a[1]=c[1][1]),c[1][0]>a[0]&&(a[0]=c[1][0]),a},[0,0])},t.pathSpace=function(a){return arguments.length?(A=a,t):A},t.groupMargin=function(a){return arguments.length?(E=a,t):E},t.scenePadding=function(a){return arguments.length?(F=a,t):F},t.labelSize=function(a){return arguments.length?(C=a,t):C},t.labelPosition=function(a){return arguments.length?(D=a,t):D},t.links=function(){return x},t.link=function(){function a(a){var c,d,e,f,g,h,i,j,k;return c=a.source.scene?a.source.scene.x+a.source.x:a.source.x,e=a.source.scene?a.source.scene.y+a.source.y:a.source.y,d=a.target.scene?a.target.scene.x+a.target.x:a.target.x,f=a.target.scene?a.target.scene.y+a.target.y:a.target.y,"vertical"===z?(k=d3.interpolateNumber(e,f),g=c,h=k(b),i=d,j=k(1-b)):(k=d3.interpolateNumber(c,d),g=k(b),h=e,i=k(1-b),j=f),"M"+c+","+e+"C"+g+","+h+" "+i+","+j+" "+d+","+f}var b=.5;return a.curvature=function(c){return arguments.length?(b=c,a):b},a},t.introductions=function(){return w},t.layout=function(){return b(),c(),d(),e(),f(),g(),h(),i(),j(),k(),l(),m(),n(),o(),t},t};