code: function updateNodes(selection, records, showStruct) {
    const nodes = selection.selectAll('.node')
      .data(records, d => d.index);
    nodes.exit().remove();
    const entered = nodes.enter()
      .append('g')
        .attr('class', 'node')
        .call(updateNodeCoords);
    entered.append('circle')
        .attr('class', 'node-symbol');
    entered.append('g')
        .attr('class', 'node-content')
        .attr('transform', `translate(${-svgWidth / 2},${-svgHeight / 2})`);
    entered.append('text')
        .attr('class', 'node-label')
        .attr('x', 0)
        .attr('text-anchor', 'middle');
    entered.append('foreignObject')
        .attr('class', 'node-html')
      .append('xhtml:div');
    const merged = entered.merge(nodes);
    if (showStruct) {
      merged.select('.node-content').html(d => d.structure);
    } else {
      merged.select('.node-content').select('svg').remove();
    }
  }
docs: TODO