@@ -11,10 +11,12 @@ export function treeNode({
1111 treeSort,
1212 treeSeparation,
1313 treeAnchor,
14+ treeFilter,
1415 ...options
1516} = { } ) {
1617 treeAnchor = maybeTreeAnchor ( treeAnchor ) ;
1718 treeSort = maybeTreeSort ( treeSort ) ;
19+ if ( treeFilter != null ) treeFilter = maybeNodeValue ( treeFilter ) ;
1820 if ( frameAnchor === undefined ) frameAnchor = treeAnchor . frameAnchor ;
1921 const normalize = normalizer ( delimiter ) ;
2022 const outputs = treeOutputs ( options , maybeNodeValue ) ;
@@ -42,15 +44,9 @@ export function treeNode({
4244 if ( treeSort != null ) root . sort ( treeSort ) ;
4345 layout ( root ) ;
4446 for ( const node of root . descendants ( ) ) {
47+ if ( treeFilter != null && ! treeFilter ( node ) ) continue ;
4548 treeFacet . push ( ++ treeIndex ) ;
46- treeData [ treeIndex ] = {
47- data : node . data ,
48- name : nodeName ( node ) ,
49- path : nodePath ( node ) ,
50- internal : nodeInternal ( node ) ,
51- depth : node . depth , // nodeDepth(node)
52- height : node . height // nodeHeight(node)
53- } ;
49+ treeData [ treeIndex ] = node . data ;
5450 treeAnchor . position ( node , treeIndex , X , Y ) ;
5551 for ( const o of outputs ) o [ output_values ] [ treeIndex ] = o [ output_evaluate ] ( node ) ;
5652 }
@@ -73,10 +69,12 @@ export function treeLink({
7369 treeSort,
7470 treeSeparation,
7571 treeAnchor,
72+ treeFilter,
7673 ...options
7774} = { } ) {
7875 treeAnchor = maybeTreeAnchor ( treeAnchor ) ;
7976 treeSort = maybeTreeSort ( treeSort ) ;
77+ if ( treeFilter != null ) treeFilter = maybeLinkValue ( treeFilter ) ;
8078 options = { curve, stroke, strokeWidth, strokeOpacity, ...options } ;
8179 const normalize = normalizer ( delimiter ) ;
8280 const outputs = treeOutputs ( options , maybeLinkValue ) ;
@@ -109,6 +107,7 @@ export function treeLink({
109107 if ( treeSort != null ) root . sort ( treeSort ) ;
110108 layout ( root ) ;
111109 for ( const { source, target} of root . links ( ) ) {
110+ if ( treeFilter != null && ! treeFilter ( target , source ) ) continue ;
112111 treeFacet . push ( ++ treeIndex ) ;
113112 treeData [ treeIndex ] = target . data ;
114113 treeAnchor . position ( source , treeIndex , X1 , Y1 ) ;
@@ -201,6 +200,8 @@ function maybeNodeValue(value) {
201200 return nodePath ;
202201 case "node:internal" :
203202 return nodeInternal ;
203+ case "node:external" :
204+ return nodeExternal ;
204205 case "node:depth" :
205206 return nodeDepth ;
206207 case "node:height" :
@@ -229,6 +230,8 @@ function maybeLinkValue(value) {
229230 return nodePath ;
230231 case "node:internal" :
231232 return nodeInternal ;
233+ case "node:external" :
234+ return nodeExternal ;
232235 case "node:depth" :
233236 return nodeDepth ;
234237 case "node:height" :
@@ -257,6 +260,10 @@ function nodeInternal(node) {
257260 return ! ! node . children ;
258261}
259262
263+ function nodeExternal ( node ) {
264+ return ! node . children ;
265+ }
266+
260267function parentValue ( evaluate ) {
261268 return ( child , parent ) => ( parent == null ? undefined : evaluate ( parent ) ) ;
262269}
0 commit comments