diff --git a/CHANGELOG.md b/CHANGELOG.md index 1940ecc..be51024 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,21 @@ + +# [2.1.0](https://github.com/ErikGartner/dtree/compare/2.0.2...v2.1.0) (2019-02-23) + + +### Bug Fixes + +* Bug in build script to update CDN link ([2525601](https://github.com/ErikGartner/dtree/commit/2525601)) +* Missing borders in dTree demo ([5926c15](https://github.com/ErikGartner/dtree/commit/5926c15)) + +### Features + +* Add border to SVG in demo ([7876de6](https://github.com/ErikGartner/dtree/commit/7876de6)) +* Add callback for node width separation #27 ([027de86](https://github.com/ErikGartner/dtree/commit/027de86)) +* Remove unused test stub code ([938395a](https://github.com/ErikGartner/dtree/commit/938395a)) +* Update dependencies with Yarn ([6a207c6](https://github.com/ErikGartner/dtree/commit/6a207c6)) + + + ## [2.0.2](https://github.com/ErikGartner/dtree/compare/2.0.1...v2.0.2) (2017-05-02) diff --git a/README.md b/README.md index 317a364..a08a9c9 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ yarn add d3-dtree Lastly dTree is also available through several CDNs such as [jsDelivr](https://www.jsdelivr.com/package/npm/d3-dtree): ``` -https://cdn.jsdelivr.net/npm/d3-dtree@2.0.2/dist/dTree.min.js +https://cdn.jsdelivr.net/npm/d3-dtree@2.1.0/dist/dTree.min.js ``` ## Requirements diff --git a/dist/dTree.js b/dist/dTree.js index 16f0f4e..b2ec2f2 100644 --- a/dist/dTree.js +++ b/dist/dTree.js @@ -46,7 +46,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons var svg = this.svg = d3.select(opts.target).append('svg').attr('width', width).attr('height', height).call(zoom).append('g').attr('transform', 'translate(' + width / 2 + ',' + opts.margin.top + ')'); // Compute the layout. - this.tree = d3.tree().nodeSize([nodeSize[0] * 2, nodeSize[1] * 2.5]); + this.tree = d3.tree().nodeSize([nodeSize[0] * 2, opts.callbacks.nodeHeightSeperation(nodeSize[0], nodeSize[1])]); this.tree.separation(function separation(a, b) { if (a.data.hidden || b.data.hidden) { @@ -216,6 +216,11 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons return fun(linedata); } }], [{ + key: '_nodeHeightSeperation', + value: function _nodeHeightSeperation(nodeWidth, nodeMaxHeight) { + return nodeMaxHeight + 25; + } + }, { key: '_nodeSize', value: function _nodeSize(nodes, width, textRenderer) { var maxWidth = 0; @@ -285,7 +290,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons var dTree = { - VERSION: '2.0.2', + VERSION: '2.1.0', init: function init(data) { var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; @@ -297,6 +302,9 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons height: 600, callbacks: { nodeClick: function nodeClick(name, extra, id) {}, + nodeHeightSeperation: function nodeHeightSeperation(nodeWidth, nodeMaxHeight) { + return TreeBuilder._nodeHeightSeperation(nodeWidth, nodeMaxHeight); + }, nodeRenderer: function nodeRenderer(name, x, y, height, width, extra, id, nodeClass, textClass, textRenderer) { return TreeBuilder._nodeRenderer(name, x, y, height, width, extra, id, nodeClass, textClass, textRenderer); }, diff --git a/dist/dTree.js.map b/dist/dTree.js.map index de26da8..71b75b6 100644 --- a/dist/dTree.js.map +++ b/dist/dTree.js.map @@ -1 +1 @@ -{"version":3,"sources":["dTree.js"],"names":[],"mappings":"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","file":"dTree.js","sourcesContent":["(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.dTree = factory());\n}(this, (function () { 'use strict';\n\nclass TreeBuilder {\n\n constructor(root, siblings, opts) {\n TreeBuilder.DEBUG_LEVEL = opts.debug ? 1 : 0;\n\n this.root = root;\n this.siblings = siblings;\n this.opts = opts;\n\n // flatten nodes\n this.allNodes = this._flatten(this.root);\n\n // Calculate node size\n let visibleNodes = _.filter(this.allNodes, function(n) {\n return !n.hidden;\n });\n this.nodeSize = opts.callbacks.nodeSize(visibleNodes,\n opts.nodeWidth, opts.callbacks.textRenderer);\n }\n\n create() {\n\n let opts = this.opts;\n let allNodes = this.allNodes;\n let nodeSize = this.nodeSize;\n\n let width = opts.width + opts.margin.left + opts.margin.right;\n let height = opts.height + opts.margin.top + opts.margin.bottom;\n\n let zoom = d3.zoom()\n .scaleExtent([0.1, 10])\n .on('zoom', function() {\n svg.attr('transform', d3.event.transform.translate(width / 2, opts.margin.top));\n });\n\n //make an SVG\n let svg = this.svg = d3.select(opts.target)\n .append('svg')\n .attr('width', width)\n .attr('height', height)\n .call(zoom)\n .append('g')\n .attr('transform', 'translate(' + width / 2 + ',' + opts.margin.top + ')');\n\n // Compute the layout.\n this.tree = d3.tree()\n .nodeSize([nodeSize[0] * 2, nodeSize[1] * 2.5]);\n\n this.tree.separation(function separation(a, b) {\n if (a.data.hidden || b.data.hidden) {\n return 0.3;\n } else {\n return 0.6;\n }\n });\n\n this._update(this.root);\n\n }\n\n _update(source) {\n\n let opts = this.opts;\n let allNodes = this.allNodes;\n let nodeSize = this.nodeSize;\n\n let treenodes = this.tree(source);\n let links = treenodes.links();\n\n // Create the link lines.\n this.svg.selectAll('.link')\n .data(links)\n .enter()\n // filter links with no parents to prevent empty nodes\n .filter(function(l) {\n return !l.target.data.noParent;\n })\n .append('path')\n .attr('class', opts.styles.linage)\n .attr('d', this._elbow);\n\n let nodes = this.svg.selectAll('.node')\n .data(treenodes.descendants())\n .enter();\n\n this._linkSiblings();\n\n // Draw siblings (marriage)\n this.svg.selectAll('.sibling')\n .data(this.siblings)\n .enter()\n .append('path')\n .attr('class', opts.styles.marriage)\n .attr('d', _.bind(this._siblingLine, this));\n\n // Create the node rectangles.\n nodes.append('foreignObject')\n .filter(function(d) {\n return d.data.hidden ? false : true;\n })\n .attr('x', function(d) {\n return d.x - d.cWidth / 2 + 'px';\n })\n .attr('y', function(d) {\n return d.y - d.cHeight / 2 + 'px';\n })\n .attr('width', function(d) {\n return d.cWidth + 'px';\n })\n .attr('height', function(d) {\n return d.cHeight + 'px';\n })\n .attr('id', function(d) {\n return d.id;\n })\n .html(function(d) {\n return opts.callbacks.nodeRenderer(\n d.data.name,\n d.x,\n d.y,\n nodeSize[0],\n nodeSize[1],\n d.data.extra,\n d.data.id,\n d.data.class,\n d.data.textClass,\n opts.callbacks.textRenderer);\n })\n .on('click', function(d)  {\n if (d.data.hidden) {\n return;\n }\n opts.callbacks.nodeClick(d.data.name, d.data.extra, d.data.id);\n });\n }\n\n _flatten(root) {\n let n = [];\n let i = 0;\n\n function recurse(node) {\n if (node.children) {\n node.children.forEach(recurse);\n }\n if (!node.id) {\n node.id = ++i;\n }\n n.push(node);\n }\n recurse(root);\n return n;\n }\n\n _elbow(d, i) {\n if (d.target.data.noParent) {\n return 'M0,0L0,0';\n }\n let ny = d.target.y + (d.source.y - d.target.y) * 0.50;\n\n let linedata = [{\n x: d.target.x,\n y: d.target.y\n }, {\n x: d.target.x,\n y: ny\n }, {\n x: d.source.x,\n y: d.source.y\n }];\n\n let fun = d3.line().curve(d3.curveStepAfter)\n .x(function(d) {\n return d.x;\n })\n .y(function(d) {\n return d.y;\n });\n return fun(linedata);\n }\n\n _linkSiblings() {\n\n let allNodes = this.allNodes;\n\n _.forEach(this.siblings, function(d) {\n let start = allNodes.filter(function(v) {\n return d.source.id == v.data.id;\n });\n let end = allNodes.filter(function(v) {\n return d.target.id == v.data.id;\n });\n d.source.x = start[0].x;\n d.source.y = start[0].y;\n d.target.x = end[0].x;\n d.target.y = end[0].y;\n\n let marriageId = (start[0].data.marriageNode != null ?\n start[0].data.marriageNode.id :\n end[0].data.marriageNode.id);\n let marriageNode = allNodes.find(function(n) {\n return n.data.id == marriageId;\n });\n d.source.marriageNode = marriageNode;\n d.target.marriageNode = marriageNode;\n });\n\n }\n\n _siblingLine(d, i) {\n\n let ny = d.target.y + (d.source.y - d.target.y) * 0.50;\n let nodeWidth = this.nodeSize[0];\n let nodeHeight = this.nodeSize[1];\n\n // Not first marriage\n if (d.number > 0) {\n ny -= nodeHeight * 8 / 10;\n }\n\n let linedata = [{\n x: d.source.x,\n y: d.source.y\n }, {\n x: d.source.x + nodeWidth * 6 / 10,\n y: d.source.y\n }, {\n x: d.source.x + nodeWidth * 6 / 10,\n y: ny\n }, {\n x: d.target.marriageNode.x,\n y: ny\n }, {\n x: d.target.marriageNode.x,\n y: d.target.y\n }, {\n x: d.target.x,\n y: d.target.y\n }];\n\n let fun = d3.line().curve(d3.curveStepAfter)\n .x(function(d) {\n return d.x;\n })\n .y(function(d) {\n return d.y;\n });\n return fun(linedata);\n }\n\n static _nodeSize(nodes, width, textRenderer) {\n let maxWidth = 0;\n let maxHeight = 0;\n let tmpSvg = document.createElement('svg');\n document.body.appendChild(tmpSvg);\n\n _.map(nodes, function(n) {\n let container = document.createElement('div');\n container.setAttribute('class', n.data.class);\n container.style.visibility = 'hidden';\n container.style.maxWidth = width + 'px';\n\n let text = textRenderer(n.data.name, n.data.extra, n.data.textClass);\n container.innerHTML = text;\n\n tmpSvg.appendChild(container);\n let height = container.offsetHeight;\n tmpSvg.removeChild(container);\n\n maxHeight = Math.max(maxHeight, height);\n n.cHeight = height;\n if (n.data.hidden) {\n n.cWidth = 0;\n } else {\n n.cWidth = width;\n }\n });\n document.body.removeChild(tmpSvg);\n\n return [width, maxHeight];\n }\n\n static _nodeRenderer(name, x, y, height, width, extra, id, nodeClass, textClass, textRenderer) {\n let node = '';\n node += '
\\n';\n node += textRenderer(name, extra, textClass);\n node += '
';\n return node;\n }\n\n static _textRenderer(name, extra, textClass) {\n let node = '';\n node += '

\\n';\n node += name;\n node += '

\\n';\n return node;\n }\n\n static _debug(msg) {\n if (TreeBuilder.DEBUG_LEVEL > 0)  {\n console.log(msg);\n }\n }\n\n}\n\nconst dTree = {\n\n VERSION: '2.0.2',\n\n init: function(data, options = {}) {\n\n var opts = _.defaultsDeep(options || {}, {\n target: '#graph',\n debug: false,\n width: 600,\n height: 600,\n callbacks: {\n nodeClick: function(name, extra, id) {},\n nodeRenderer: function(name, x, y, height, width, extra, id, nodeClass, textClass, textRenderer) {\n return TreeBuilder._nodeRenderer(name, x, y, height, width, extra,\n id,nodeClass, textClass, textRenderer);\n },\n nodeSize: function(nodes, width, textRenderer) {\n return TreeBuilder._nodeSize(nodes, width, textRenderer);\n },\n nodeSorter: function(aName, aExtra, bName, bExtra) {return 0;},\n textRenderer: function(name, extra, textClass) {\n return TreeBuilder._textRenderer(name, extra, textClass);\n },\n },\n margin: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n },\n nodeWidth: 100,\n styles: {\n node: 'node',\n linage: 'linage',\n marriage: 'marriage',\n text: 'nodeText'\n }\n });\n\n var data = this._preprocess(data, opts);\n var treeBuilder = new TreeBuilder(data.root, data.siblings, opts);\n treeBuilder.create();\n\n },\n\n _preprocess: function(data, opts) {\n\n var siblings = [];\n var id = 0;\n\n var root = {\n name: '',\n id: id++,\n hidden: true,\n children: []\n };\n\n var reconstructTree = function(person, parent) {\n\n // convert to person to d3 node\n var node = {\n name: person.name,\n id: id++,\n hidden: false,\n children: [],\n extra: person.extra,\n textClass: person.textClass ? person.textClass : opts.styles.text,\n class: person.class ? person.class : opts.styles.node\n };\n\n // hide linages to the hidden root node\n if (parent == root) {\n node.noParent = true;\n }\n\n // apply depth offset\n for (var i = 0; i < person.depthOffset; i++) {\n var pushNode = {\n name: '',\n id: id++,\n hidden: true,\n children: [],\n noParent: node.noParent\n };\n parent.children.push(pushNode);\n parent = pushNode;\n }\n\n // sort children\n dTree._sortPersons(person.children, opts);\n\n // add \"direct\" children\n _.forEach(person.children, function(child) {\n reconstructTree(child, node);\n });\n\n parent.children.push(node);\n\n //sort marriages\n dTree._sortMarriages(person.marriages, opts);\n\n // go through marriage\n _.forEach(person.marriages, function(marriage, index) {\n\n var m = {\n name: '',\n id: id++,\n hidden: true,\n noParent: true,\n children: [],\n extra: marriage.extra\n };\n\n var sp = marriage.spouse;\n\n var spouse = {\n name: sp.name,\n id: id++,\n hidden: false,\n noParent: true,\n children: [],\n textClass: sp.textClass ? sp.textClass : opts.styles.text,\n class: sp.class ? sp.class : opts.styles.node,\n extra: sp.extra,\n marriageNode: m\n };\n\n parent.children.push(m, spouse);\n\n dTree._sortPersons(marriage.children, opts);\n _.forEach(marriage.children, function(child) {\n reconstructTree(child, m);\n });\n\n siblings.push({\n source: {\n id: node.id\n },\n target: {\n id: spouse.id\n },\n number: index\n });\n });\n\n };\n\n _.forEach(data, function(person) {\n reconstructTree(person, root);\n });\n\n return {\n root: d3.hierarchy(root),\n siblings: siblings\n };\n\n },\n\n _sortPersons: function(persons, opts) {\n if (persons != undefined) {\n persons.sort(function(a, b) {\n return opts.callbacks.nodeSorter(a.name, a.extra, b.name, b.extra);\n });\n }\n return persons;\n },\n\n _sortMarriages: function(marriages, opts) {\n if (marriages != undefined && Array.isArray(marriages)) {\n marriages.sort(function(marriageA, marriageB) {\n var a = marriageA.spouse;\n var b = marriageB.spouse;\n return opts.callbacks.nodeSorter(a.name, a.extra, b.name, b.extra);\n });\n }\n return marriages;\n }\n\n};\n\nreturn dTree;\n\n})));\n"]} \ No newline at end of file +{"version":3,"sources":["dTree.js"],"names":[],"mappings":"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","file":"dTree.js","sourcesContent":["(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.dTree = factory());\n}(this, (function () { 'use strict';\n\nclass TreeBuilder {\n\n constructor(root, siblings, opts) {\n TreeBuilder.DEBUG_LEVEL = opts.debug ? 1 : 0;\n\n this.root = root;\n this.siblings = siblings;\n this.opts = opts;\n\n // flatten nodes\n this.allNodes = this._flatten(this.root);\n\n // Calculate node size\n let visibleNodes = _.filter(this.allNodes, function(n) {\n return !n.hidden;\n });\n this.nodeSize = opts.callbacks.nodeSize(visibleNodes,\n opts.nodeWidth, opts.callbacks.textRenderer);\n }\n\n create() {\n\n let opts = this.opts;\n let allNodes = this.allNodes;\n let nodeSize = this.nodeSize;\n\n let width = opts.width + opts.margin.left + opts.margin.right;\n let height = opts.height + opts.margin.top + opts.margin.bottom;\n\n let zoom = d3.zoom()\n .scaleExtent([0.1, 10])\n .on('zoom', function() {\n svg.attr('transform', d3.event.transform.translate(width / 2, opts.margin.top));\n });\n\n //make an SVG\n let svg = this.svg = d3.select(opts.target)\n .append('svg')\n .attr('width', width)\n .attr('height', height)\n .call(zoom)\n .append('g')\n .attr('transform', 'translate(' + width / 2 + ',' + opts.margin.top + ')');\n\n // Compute the layout.\n this.tree = d3.tree()\n .nodeSize([nodeSize[0] * 2,\n opts.callbacks.nodeHeightSeperation(nodeSize[0], nodeSize[1])]);\n\n this.tree.separation(function separation(a, b) {\n if (a.data.hidden || b.data.hidden) {\n return 0.3;\n } else {\n return 0.6;\n }\n });\n\n this._update(this.root);\n\n }\n\n _update(source) {\n\n let opts = this.opts;\n let allNodes = this.allNodes;\n let nodeSize = this.nodeSize;\n\n let treenodes = this.tree(source);\n let links = treenodes.links();\n\n // Create the link lines.\n this.svg.selectAll('.link')\n .data(links)\n .enter()\n // filter links with no parents to prevent empty nodes\n .filter(function(l) {\n return !l.target.data.noParent;\n })\n .append('path')\n .attr('class', opts.styles.linage)\n .attr('d', this._elbow);\n\n let nodes = this.svg.selectAll('.node')\n .data(treenodes.descendants())\n .enter();\n\n this._linkSiblings();\n\n // Draw siblings (marriage)\n this.svg.selectAll('.sibling')\n .data(this.siblings)\n .enter()\n .append('path')\n .attr('class', opts.styles.marriage)\n .attr('d', _.bind(this._siblingLine, this));\n\n // Create the node rectangles.\n nodes.append('foreignObject')\n .filter(function(d) {\n return d.data.hidden ? false : true;\n })\n .attr('x', function(d) {\n return d.x - d.cWidth / 2 + 'px';\n })\n .attr('y', function(d) {\n return d.y - d.cHeight / 2 + 'px';\n })\n .attr('width', function(d) {\n return d.cWidth + 'px';\n })\n .attr('height', function(d) {\n return d.cHeight + 'px';\n })\n .attr('id', function(d) {\n return d.id;\n })\n .html(function(d) {\n return opts.callbacks.nodeRenderer(\n d.data.name,\n d.x,\n d.y,\n nodeSize[0],\n nodeSize[1],\n d.data.extra,\n d.data.id,\n d.data.class,\n d.data.textClass,\n opts.callbacks.textRenderer);\n })\n .on('click', function(d)  {\n if (d.data.hidden) {\n return;\n }\n opts.callbacks.nodeClick(d.data.name, d.data.extra, d.data.id);\n });\n }\n\n _flatten(root) {\n let n = [];\n let i = 0;\n\n function recurse(node) {\n if (node.children) {\n node.children.forEach(recurse);\n }\n if (!node.id) {\n node.id = ++i;\n }\n n.push(node);\n }\n recurse(root);\n return n;\n }\n\n _elbow(d, i) {\n if (d.target.data.noParent) {\n return 'M0,0L0,0';\n }\n let ny = d.target.y + (d.source.y - d.target.y) * 0.50;\n\n let linedata = [{\n x: d.target.x,\n y: d.target.y\n }, {\n x: d.target.x,\n y: ny\n }, {\n x: d.source.x,\n y: d.source.y\n }];\n\n let fun = d3.line().curve(d3.curveStepAfter)\n .x(function(d) {\n return d.x;\n })\n .y(function(d) {\n return d.y;\n });\n return fun(linedata);\n }\n\n _linkSiblings() {\n\n let allNodes = this.allNodes;\n\n _.forEach(this.siblings, function(d) {\n let start = allNodes.filter(function(v) {\n return d.source.id == v.data.id;\n });\n let end = allNodes.filter(function(v) {\n return d.target.id == v.data.id;\n });\n d.source.x = start[0].x;\n d.source.y = start[0].y;\n d.target.x = end[0].x;\n d.target.y = end[0].y;\n\n let marriageId = (start[0].data.marriageNode != null ?\n start[0].data.marriageNode.id :\n end[0].data.marriageNode.id);\n let marriageNode = allNodes.find(function(n) {\n return n.data.id == marriageId;\n });\n d.source.marriageNode = marriageNode;\n d.target.marriageNode = marriageNode;\n });\n\n }\n\n _siblingLine(d, i) {\n\n let ny = d.target.y + (d.source.y - d.target.y) * 0.50;\n let nodeWidth = this.nodeSize[0];\n let nodeHeight = this.nodeSize[1];\n\n // Not first marriage\n if (d.number > 0) {\n ny -= nodeHeight * 8 / 10;\n }\n\n let linedata = [{\n x: d.source.x,\n y: d.source.y\n }, {\n x: d.source.x + nodeWidth * 6 / 10,\n y: d.source.y\n }, {\n x: d.source.x + nodeWidth * 6 / 10,\n y: ny\n }, {\n x: d.target.marriageNode.x,\n y: ny\n }, {\n x: d.target.marriageNode.x,\n y: d.target.y\n }, {\n x: d.target.x,\n y: d.target.y\n }];\n\n let fun = d3.line().curve(d3.curveStepAfter)\n .x(function(d) {\n return d.x;\n })\n .y(function(d) {\n return d.y;\n });\n return fun(linedata);\n }\n\n static _nodeHeightSeperation(nodeWidth, nodeMaxHeight) {\n return nodeMaxHeight + 25;\n }\n\n static _nodeSize(nodes, width, textRenderer) {\n let maxWidth = 0;\n let maxHeight = 0;\n let tmpSvg = document.createElement('svg');\n document.body.appendChild(tmpSvg);\n\n _.map(nodes, function(n) {\n let container = document.createElement('div');\n container.setAttribute('class', n.data.class);\n container.style.visibility = 'hidden';\n container.style.maxWidth = width + 'px';\n\n let text = textRenderer(n.data.name, n.data.extra, n.data.textClass);\n container.innerHTML = text;\n\n tmpSvg.appendChild(container);\n let height = container.offsetHeight;\n tmpSvg.removeChild(container);\n\n maxHeight = Math.max(maxHeight, height);\n n.cHeight = height;\n if (n.data.hidden) {\n n.cWidth = 0;\n } else {\n n.cWidth = width;\n }\n });\n document.body.removeChild(tmpSvg);\n\n return [width, maxHeight];\n }\n\n static _nodeRenderer(name, x, y, height, width, extra, id, nodeClass, textClass, textRenderer) {\n let node = '';\n node += '
\\n';\n node += textRenderer(name, extra, textClass);\n node += '
';\n return node;\n }\n\n static _textRenderer(name, extra, textClass) {\n let node = '';\n node += '

\\n';\n node += name;\n node += '

\\n';\n return node;\n }\n\n static _debug(msg) {\n if (TreeBuilder.DEBUG_LEVEL > 0)  {\n console.log(msg);\n }\n }\n\n}\n\nconst dTree = {\n\n VERSION: '2.1.0',\n\n init: function(data, options = {}) {\n\n var opts = _.defaultsDeep(options || {}, {\n target: '#graph',\n debug: false,\n width: 600,\n height: 600,\n callbacks: {\n nodeClick: function(name, extra, id) {},\n nodeHeightSeperation: function(nodeWidth, nodeMaxHeight) {\n return TreeBuilder._nodeHeightSeperation(nodeWidth, nodeMaxHeight);\n },\n nodeRenderer: function(name, x, y, height, width, extra, id, nodeClass, textClass, textRenderer) {\n return TreeBuilder._nodeRenderer(name, x, y, height, width, extra,\n id,nodeClass, textClass, textRenderer);\n },\n nodeSize: function(nodes, width, textRenderer) {\n return TreeBuilder._nodeSize(nodes, width, textRenderer);\n },\n nodeSorter: function(aName, aExtra, bName, bExtra) {return 0;},\n textRenderer: function(name, extra, textClass) {\n return TreeBuilder._textRenderer(name, extra, textClass);\n },\n },\n margin: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n },\n nodeWidth: 100,\n styles: {\n node: 'node',\n linage: 'linage',\n marriage: 'marriage',\n text: 'nodeText'\n }\n });\n\n var data = this._preprocess(data, opts);\n var treeBuilder = new TreeBuilder(data.root, data.siblings, opts);\n treeBuilder.create();\n\n },\n\n _preprocess: function(data, opts) {\n\n var siblings = [];\n var id = 0;\n\n var root = {\n name: '',\n id: id++,\n hidden: true,\n children: []\n };\n\n var reconstructTree = function(person, parent) {\n\n // convert to person to d3 node\n var node = {\n name: person.name,\n id: id++,\n hidden: false,\n children: [],\n extra: person.extra,\n textClass: person.textClass ? person.textClass : opts.styles.text,\n class: person.class ? person.class : opts.styles.node\n };\n\n // hide linages to the hidden root node\n if (parent == root) {\n node.noParent = true;\n }\n\n // apply depth offset\n for (var i = 0; i < person.depthOffset; i++) {\n var pushNode = {\n name: '',\n id: id++,\n hidden: true,\n children: [],\n noParent: node.noParent\n };\n parent.children.push(pushNode);\n parent = pushNode;\n }\n\n // sort children\n dTree._sortPersons(person.children, opts);\n\n // add \"direct\" children\n _.forEach(person.children, function(child) {\n reconstructTree(child, node);\n });\n\n parent.children.push(node);\n\n //sort marriages\n dTree._sortMarriages(person.marriages, opts);\n\n // go through marriage\n _.forEach(person.marriages, function(marriage, index) {\n\n var m = {\n name: '',\n id: id++,\n hidden: true,\n noParent: true,\n children: [],\n extra: marriage.extra\n };\n\n var sp = marriage.spouse;\n\n var spouse = {\n name: sp.name,\n id: id++,\n hidden: false,\n noParent: true,\n children: [],\n textClass: sp.textClass ? sp.textClass : opts.styles.text,\n class: sp.class ? sp.class : opts.styles.node,\n extra: sp.extra,\n marriageNode: m\n };\n\n parent.children.push(m, spouse);\n\n dTree._sortPersons(marriage.children, opts);\n _.forEach(marriage.children, function(child) {\n reconstructTree(child, m);\n });\n\n siblings.push({\n source: {\n id: node.id\n },\n target: {\n id: spouse.id\n },\n number: index\n });\n });\n\n };\n\n _.forEach(data, function(person) {\n reconstructTree(person, root);\n });\n\n return {\n root: d3.hierarchy(root),\n siblings: siblings\n };\n\n },\n\n _sortPersons: function(persons, opts) {\n if (persons != undefined) {\n persons.sort(function(a, b) {\n return opts.callbacks.nodeSorter(a.name, a.extra, b.name, b.extra);\n });\n }\n return persons;\n },\n\n _sortMarriages: function(marriages, opts) {\n if (marriages != undefined && Array.isArray(marriages)) {\n marriages.sort(function(marriageA, marriageB) {\n var a = marriageA.spouse;\n var b = marriageB.spouse;\n return opts.callbacks.nodeSorter(a.name, a.extra, b.name, b.extra);\n });\n }\n return marriages;\n }\n\n};\n\nreturn dTree;\n\n})));\n"]} \ No newline at end of file diff --git a/dist/dTree.min.js b/dist/dTree.min.js index da3460c..6f7dc68 100644 --- a/dist/dTree.min.js +++ b/dist/dTree.min.js @@ -1,2 +1,2 @@ -function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var _createClass=function(){function e(e,t){for(var n=0;n0&&(n-=8*a/10);var i=[{x:e.source.x,y:e.source.y},{x:e.source.x+6*r/10,y:e.source.y},{x:e.source.x+6*r/10,y:n},{x:e.target.marriageNode.x,y:n},{x:e.target.marriageNode.x,y:e.target.y},{x:e.target.x,y:e.target.y}],s=d3.line().curve(d3.curveStepAfter).x(function(e){return e.x}).y(function(e){return e.y});return s(i)}}],[{key:"_nodeSize",value:function(e,t,n){var r=0,a=document.createElement("svg");return document.body.appendChild(a),_.map(e,function(e){var i=document.createElement("div");i.setAttribute("class",e.data["class"]),i.style.visibility="hidden",i.style.maxWidth=t+"px";var s=n(e.data.name,e.data.extra,e.data.textClass);i.innerHTML=s,a.appendChild(i);var o=i.offsetHeight;a.removeChild(i),r=Math.max(r,o),e.cHeight=o,e.data.hidden?e.cWidth=0:e.cWidth=t}),document.body.removeChild(a),[t,r]}},{key:"_nodeRenderer",value:function(e,t,n,r,a,i,s,o,d,c){var l="";return l+="
\n',l+=c(e,i,d),l+="
"}},{key:"_textRenderer",value:function(e,t,n){var r="";return r+="

\n',r+=e,r+="

\n"}},{key:"_debug",value:function(t){e.DEBUG_LEVEL>0&&console.log(t)}}]),e}(),t={VERSION:"2.0.2",init:function(t){var n=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],r=_.defaultsDeep(n||{},{target:"#graph",debug:!1,width:600,height:600,callbacks:{nodeClick:function(e,t,n){},nodeRenderer:function(t,n,r,a,i,s,o,d,c,l){return e._nodeRenderer(t,n,r,a,i,s,o,d,c,l)},nodeSize:function(t,n,r){return e._nodeSize(t,n,r)},nodeSorter:function(e,t,n,r){return 0},textRenderer:function(t,n,r){return e._textRenderer(t,n,r)}},margin:{top:0,right:0,bottom:0,left:0},nodeWidth:100,styles:{node:"node",linage:"linage",marriage:"marriage",text:"nodeText"}}),t=this._preprocess(t,r),a=new e(t.root,t.siblings,r);a.create()},_preprocess:function(e,n){var r=[],a=0,i={name:"",id:a++,hidden:!0,children:[]},s=function o(e,s){var d={name:e.name,id:a++,hidden:!1,children:[],extra:e.extra,textClass:e.textClass?e.textClass:n.styles.text,"class":e["class"]?e["class"]:n.styles.node};s==i&&(d.noParent=!0);for(var c=0;c0&&(n-=8*a/10);var i=[{x:e.source.x,y:e.source.y},{x:e.source.x+6*r/10,y:e.source.y},{x:e.source.x+6*r/10,y:n},{x:e.target.marriageNode.x,y:n},{x:e.target.marriageNode.x,y:e.target.y},{x:e.target.x,y:e.target.y}],o=d3.line().curve(d3.curveStepAfter).x(function(e){return e.x}).y(function(e){return e.y});return o(i)}}],[{key:"_nodeHeightSeperation",value:function(e,t){return t+25}},{key:"_nodeSize",value:function(e,t,n){var r=0,a=document.createElement("svg");return document.body.appendChild(a),_.map(e,function(e){var i=document.createElement("div");i.setAttribute("class",e.data["class"]),i.style.visibility="hidden",i.style.maxWidth=t+"px";var o=n(e.data.name,e.data.extra,e.data.textClass);i.innerHTML=o,a.appendChild(i);var s=i.offsetHeight;a.removeChild(i),r=Math.max(r,s),e.cHeight=s,e.data.hidden?e.cWidth=0:e.cWidth=t}),document.body.removeChild(a),[t,r]}},{key:"_nodeRenderer",value:function(e,t,n,r,a,i,o,s,d,c){var l="";return l+="
\n',l+=c(e,i,d),l+="
"}},{key:"_textRenderer",value:function(e,t,n){var r="";return r+="

\n',r+=e,r+="

\n"}},{key:"_debug",value:function(t){e.DEBUG_LEVEL>0&&console.log(t)}}]),e}(),t={VERSION:"2.1.0",init:function(t){var n=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],r=_.defaultsDeep(n||{},{target:"#graph",debug:!1,width:600,height:600,callbacks:{nodeClick:function(e,t,n){},nodeHeightSeperation:function(t,n){return e._nodeHeightSeperation(t,n)},nodeRenderer:function(t,n,r,a,i,o,s,d,c,l){return e._nodeRenderer(t,n,r,a,i,o,s,d,c,l)},nodeSize:function(t,n,r){return e._nodeSize(t,n,r)},nodeSorter:function(e,t,n,r){return 0},textRenderer:function(t,n,r){return e._textRenderer(t,n,r)}},margin:{top:0,right:0,bottom:0,left:0},nodeWidth:100,styles:{node:"node",linage:"linage",marriage:"marriage",text:"nodeText"}}),t=this._preprocess(t,r),a=new e(t.root,t.siblings,r);a.create()},_preprocess:function(e,n){var r=[],a=0,i={name:"",id:a++,hidden:!0,children:[]},o=function s(e,o){var d={name:e.name,id:a++,hidden:!1,children:[],extra:e.extra,textClass:e.textClass?e.textClass:n.styles.text,"class":e["class"]?e["class"]:n.styles.node};o==i&&(d.noParent=!0);for(var c=0;c 0) {\n ny -= nodeHeight * 8 / 10;\n }\n\n var linedata = [{\n x: d.source.x,\n y: d.source.y\n }, {\n x: d.source.x + nodeWidth * 6 / 10,\n y: d.source.y\n }, {\n x: d.source.x + nodeWidth * 6 / 10,\n y: ny\n }, {\n x: d.target.marriageNode.x,\n y: ny\n }, {\n x: d.target.marriageNode.x,\n y: d.target.y\n }, {\n x: d.target.x,\n y: d.target.y\n }];\n\n var fun = d3.line().curve(d3.curveStepAfter).x(function (d) {\n return d.x;\n }).y(function (d) {\n return d.y;\n });\n return fun(linedata);\n }\n }], [{\n key: '_nodeSize',\n value: function _nodeSize(nodes, width, textRenderer) {\n var maxWidth = 0;\n var maxHeight = 0;\n var tmpSvg = document.createElement('svg');\n document.body.appendChild(tmpSvg);\n\n _.map(nodes, function (n) {\n var container = document.createElement('div');\n container.setAttribute('class', n.data['class']);\n container.style.visibility = 'hidden';\n container.style.maxWidth = width + 'px';\n\n var text = textRenderer(n.data.name, n.data.extra, n.data.textClass);\n container.innerHTML = text;\n\n tmpSvg.appendChild(container);\n var height = container.offsetHeight;\n tmpSvg.removeChild(container);\n\n maxHeight = Math.max(maxHeight, height);\n n.cHeight = height;\n if (n.data.hidden) {\n n.cWidth = 0;\n } else {\n n.cWidth = width;\n }\n });\n document.body.removeChild(tmpSvg);\n\n return [width, maxHeight];\n }\n }, {\n key: '_nodeRenderer',\n value: function _nodeRenderer(name, x, y, height, width, extra, id, nodeClass, textClass, textRenderer) {\n var node = '';\n node += '
\\n';\n node += textRenderer(name, extra, textClass);\n node += '
';\n return node;\n }\n }, {\n key: '_textRenderer',\n value: function _textRenderer(name, extra, textClass) {\n var node = '';\n node += '

\\n';\n node += name;\n node += '

\\n';\n return node;\n }\n }, {\n key: '_debug',\n value: function _debug(msg) {\n if (TreeBuilder.DEBUG_LEVEL > 0) {\n console.log(msg);\n }\n }\n }]);\n\n return TreeBuilder;\n })();\n\n var dTree = {\n\n VERSION: '2.0.2',\n\n init: function init(data) {\n var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var opts = _.defaultsDeep(options || {}, {\n target: '#graph',\n debug: false,\n width: 600,\n height: 600,\n callbacks: {\n nodeClick: function nodeClick(name, extra, id) {},\n nodeRenderer: function nodeRenderer(name, x, y, height, width, extra, id, nodeClass, textClass, textRenderer) {\n return TreeBuilder._nodeRenderer(name, x, y, height, width, extra, id, nodeClass, textClass, textRenderer);\n },\n nodeSize: function nodeSize(nodes, width, textRenderer) {\n return TreeBuilder._nodeSize(nodes, width, textRenderer);\n },\n nodeSorter: function nodeSorter(aName, aExtra, bName, bExtra) {\n return 0;\n },\n textRenderer: function textRenderer(name, extra, textClass) {\n return TreeBuilder._textRenderer(name, extra, textClass);\n }\n },\n margin: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n },\n nodeWidth: 100,\n styles: {\n node: 'node',\n linage: 'linage',\n marriage: 'marriage',\n text: 'nodeText'\n }\n });\n\n var data = this._preprocess(data, opts);\n var treeBuilder = new TreeBuilder(data.root, data.siblings, opts);\n treeBuilder.create();\n },\n\n _preprocess: function _preprocess(data, opts) {\n\n var siblings = [];\n var id = 0;\n\n var root = {\n name: '',\n id: id++,\n hidden: true,\n children: []\n };\n\n var reconstructTree = function reconstructTree(person, parent) {\n\n // convert to person to d3 node\n var node = {\n name: person.name,\n id: id++,\n hidden: false,\n children: [],\n extra: person.extra,\n textClass: person.textClass ? person.textClass : opts.styles.text,\n 'class': person['class'] ? person['class'] : opts.styles.node\n };\n\n // hide linages to the hidden root node\n if (parent == root) {\n node.noParent = true;\n }\n\n // apply depth offset\n for (var i = 0; i < person.depthOffset; i++) {\n var pushNode = {\n name: '',\n id: id++,\n hidden: true,\n children: [],\n noParent: node.noParent\n };\n parent.children.push(pushNode);\n parent = pushNode;\n }\n\n // sort children\n dTree._sortPersons(person.children, opts);\n\n // add \"direct\" children\n _.forEach(person.children, function (child) {\n reconstructTree(child, node);\n });\n\n parent.children.push(node);\n\n //sort marriages\n dTree._sortMarriages(person.marriages, opts);\n\n // go through marriage\n _.forEach(person.marriages, function (marriage, index) {\n\n var m = {\n name: '',\n id: id++,\n hidden: true,\n noParent: true,\n children: [],\n extra: marriage.extra\n };\n\n var sp = marriage.spouse;\n\n var spouse = {\n name: sp.name,\n id: id++,\n hidden: false,\n noParent: true,\n children: [],\n textClass: sp.textClass ? sp.textClass : opts.styles.text,\n 'class': sp['class'] ? sp['class'] : opts.styles.node,\n extra: sp.extra,\n marriageNode: m\n };\n\n parent.children.push(m, spouse);\n\n dTree._sortPersons(marriage.children, opts);\n _.forEach(marriage.children, function (child) {\n reconstructTree(child, m);\n });\n\n siblings.push({\n source: {\n id: node.id\n },\n target: {\n id: spouse.id\n },\n number: index\n });\n });\n };\n\n _.forEach(data, function (person) {\n reconstructTree(person, root);\n });\n\n return {\n root: d3.hierarchy(root),\n siblings: siblings\n };\n },\n\n _sortPersons: function _sortPersons(persons, opts) {\n if (persons != undefined) {\n persons.sort(function (a, b) {\n return opts.callbacks.nodeSorter(a.name, a.extra, b.name, b.extra);\n });\n }\n return persons;\n },\n\n _sortMarriages: function _sortMarriages(marriages, opts) {\n if (marriages != undefined && Array.isArray(marriages)) {\n marriages.sort(function (marriageA, marriageB) {\n var a = marriageA.spouse;\n var b = marriageB.spouse;\n return opts.callbacks.nodeSorter(a.name, a.extra, b.name, b.extra);\n });\n }\n return marriages;\n }\n\n };\n\n return dTree;\n});\n//# sourceMappingURL=dTree.js.map\n","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.dTree = factory());\n}(this, (function () { 'use strict';\n\nclass TreeBuilder {\n\n constructor(root, siblings, opts) {\n TreeBuilder.DEBUG_LEVEL = opts.debug ? 1 : 0;\n\n this.root = root;\n this.siblings = siblings;\n this.opts = opts;\n\n // flatten nodes\n this.allNodes = this._flatten(this.root);\n\n // Calculate node size\n let visibleNodes = _.filter(this.allNodes, function(n) {\n return !n.hidden;\n });\n this.nodeSize = opts.callbacks.nodeSize(visibleNodes,\n opts.nodeWidth, opts.callbacks.textRenderer);\n }\n\n create() {\n\n let opts = this.opts;\n let allNodes = this.allNodes;\n let nodeSize = this.nodeSize;\n\n let width = opts.width + opts.margin.left + opts.margin.right;\n let height = opts.height + opts.margin.top + opts.margin.bottom;\n\n let zoom = d3.zoom()\n .scaleExtent([0.1, 10])\n .on('zoom', function() {\n svg.attr('transform', d3.event.transform.translate(width / 2, opts.margin.top));\n });\n\n //make an SVG\n let svg = this.svg = d3.select(opts.target)\n .append('svg')\n .attr('width', width)\n .attr('height', height)\n .call(zoom)\n .append('g')\n .attr('transform', 'translate(' + width / 2 + ',' + opts.margin.top + ')');\n\n // Compute the layout.\n this.tree = d3.tree()\n .nodeSize([nodeSize[0] * 2, nodeSize[1] * 2.5]);\n\n this.tree.separation(function separation(a, b) {\n if (a.data.hidden || b.data.hidden) {\n return 0.3;\n } else {\n return 0.6;\n }\n });\n\n this._update(this.root);\n\n }\n\n _update(source) {\n\n let opts = this.opts;\n let allNodes = this.allNodes;\n let nodeSize = this.nodeSize;\n\n let treenodes = this.tree(source);\n let links = treenodes.links();\n\n // Create the link lines.\n this.svg.selectAll('.link')\n .data(links)\n .enter()\n // filter links with no parents to prevent empty nodes\n .filter(function(l) {\n return !l.target.data.noParent;\n })\n .append('path')\n .attr('class', opts.styles.linage)\n .attr('d', this._elbow);\n\n let nodes = this.svg.selectAll('.node')\n .data(treenodes.descendants())\n .enter();\n\n this._linkSiblings();\n\n // Draw siblings (marriage)\n this.svg.selectAll('.sibling')\n .data(this.siblings)\n .enter()\n .append('path')\n .attr('class', opts.styles.marriage)\n .attr('d', _.bind(this._siblingLine, this));\n\n // Create the node rectangles.\n nodes.append('foreignObject')\n .filter(function(d) {\n return d.data.hidden ? false : true;\n })\n .attr('x', function(d) {\n return d.x - d.cWidth / 2 + 'px';\n })\n .attr('y', function(d) {\n return d.y - d.cHeight / 2 + 'px';\n })\n .attr('width', function(d) {\n return d.cWidth + 'px';\n })\n .attr('height', function(d) {\n return d.cHeight + 'px';\n })\n .attr('id', function(d) {\n return d.id;\n })\n .html(function(d) {\n return opts.callbacks.nodeRenderer(\n d.data.name,\n d.x,\n d.y,\n nodeSize[0],\n nodeSize[1],\n d.data.extra,\n d.data.id,\n d.data.class,\n d.data.textClass,\n opts.callbacks.textRenderer);\n })\n .on('click', function(d)  {\n if (d.data.hidden) {\n return;\n }\n opts.callbacks.nodeClick(d.data.name, d.data.extra, d.data.id);\n });\n }\n\n _flatten(root) {\n let n = [];\n let i = 0;\n\n function recurse(node) {\n if (node.children) {\n node.children.forEach(recurse);\n }\n if (!node.id) {\n node.id = ++i;\n }\n n.push(node);\n }\n recurse(root);\n return n;\n }\n\n _elbow(d, i) {\n if (d.target.data.noParent) {\n return 'M0,0L0,0';\n }\n let ny = d.target.y + (d.source.y - d.target.y) * 0.50;\n\n let linedata = [{\n x: d.target.x,\n y: d.target.y\n }, {\n x: d.target.x,\n y: ny\n }, {\n x: d.source.x,\n y: d.source.y\n }];\n\n let fun = d3.line().curve(d3.curveStepAfter)\n .x(function(d) {\n return d.x;\n })\n .y(function(d) {\n return d.y;\n });\n return fun(linedata);\n }\n\n _linkSiblings() {\n\n let allNodes = this.allNodes;\n\n _.forEach(this.siblings, function(d) {\n let start = allNodes.filter(function(v) {\n return d.source.id == v.data.id;\n });\n let end = allNodes.filter(function(v) {\n return d.target.id == v.data.id;\n });\n d.source.x = start[0].x;\n d.source.y = start[0].y;\n d.target.x = end[0].x;\n d.target.y = end[0].y;\n\n let marriageId = (start[0].data.marriageNode != null ?\n start[0].data.marriageNode.id :\n end[0].data.marriageNode.id);\n let marriageNode = allNodes.find(function(n) {\n return n.data.id == marriageId;\n });\n d.source.marriageNode = marriageNode;\n d.target.marriageNode = marriageNode;\n });\n\n }\n\n _siblingLine(d, i) {\n\n let ny = d.target.y + (d.source.y - d.target.y) * 0.50;\n let nodeWidth = this.nodeSize[0];\n let nodeHeight = this.nodeSize[1];\n\n // Not first marriage\n if (d.number > 0) {\n ny -= nodeHeight * 8 / 10;\n }\n\n let linedata = [{\n x: d.source.x,\n y: d.source.y\n }, {\n x: d.source.x + nodeWidth * 6 / 10,\n y: d.source.y\n }, {\n x: d.source.x + nodeWidth * 6 / 10,\n y: ny\n }, {\n x: d.target.marriageNode.x,\n y: ny\n }, {\n x: d.target.marriageNode.x,\n y: d.target.y\n }, {\n x: d.target.x,\n y: d.target.y\n }];\n\n let fun = d3.line().curve(d3.curveStepAfter)\n .x(function(d) {\n return d.x;\n })\n .y(function(d) {\n return d.y;\n });\n return fun(linedata);\n }\n\n static _nodeSize(nodes, width, textRenderer) {\n let maxWidth = 0;\n let maxHeight = 0;\n let tmpSvg = document.createElement('svg');\n document.body.appendChild(tmpSvg);\n\n _.map(nodes, function(n) {\n let container = document.createElement('div');\n container.setAttribute('class', n.data.class);\n container.style.visibility = 'hidden';\n container.style.maxWidth = width + 'px';\n\n let text = textRenderer(n.data.name, n.data.extra, n.data.textClass);\n container.innerHTML = text;\n\n tmpSvg.appendChild(container);\n let height = container.offsetHeight;\n tmpSvg.removeChild(container);\n\n maxHeight = Math.max(maxHeight, height);\n n.cHeight = height;\n if (n.data.hidden) {\n n.cWidth = 0;\n } else {\n n.cWidth = width;\n }\n });\n document.body.removeChild(tmpSvg);\n\n return [width, maxHeight];\n }\n\n static _nodeRenderer(name, x, y, height, width, extra, id, nodeClass, textClass, textRenderer) {\n let node = '';\n node += '
\\n';\n node += textRenderer(name, extra, textClass);\n node += '
';\n return node;\n }\n\n static _textRenderer(name, extra, textClass) {\n let node = '';\n node += '

\\n';\n node += name;\n node += '

\\n';\n return node;\n }\n\n static _debug(msg) {\n if (TreeBuilder.DEBUG_LEVEL > 0)  {\n console.log(msg);\n }\n }\n\n}\n\nconst dTree = {\n\n VERSION: '2.0.2',\n\n init: function(data, options = {}) {\n\n var opts = _.defaultsDeep(options || {}, {\n target: '#graph',\n debug: false,\n width: 600,\n height: 600,\n callbacks: {\n nodeClick: function(name, extra, id) {},\n nodeRenderer: function(name, x, y, height, width, extra, id, nodeClass, textClass, textRenderer) {\n return TreeBuilder._nodeRenderer(name, x, y, height, width, extra,\n id,nodeClass, textClass, textRenderer);\n },\n nodeSize: function(nodes, width, textRenderer) {\n return TreeBuilder._nodeSize(nodes, width, textRenderer);\n },\n nodeSorter: function(aName, aExtra, bName, bExtra) {return 0;},\n textRenderer: function(name, extra, textClass) {\n return TreeBuilder._textRenderer(name, extra, textClass);\n },\n },\n margin: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n },\n nodeWidth: 100,\n styles: {\n node: 'node',\n linage: 'linage',\n marriage: 'marriage',\n text: 'nodeText'\n }\n });\n\n var data = this._preprocess(data, opts);\n var treeBuilder = new TreeBuilder(data.root, data.siblings, opts);\n treeBuilder.create();\n\n },\n\n _preprocess: function(data, opts) {\n\n var siblings = [];\n var id = 0;\n\n var root = {\n name: '',\n id: id++,\n hidden: true,\n children: []\n };\n\n var reconstructTree = function(person, parent) {\n\n // convert to person to d3 node\n var node = {\n name: person.name,\n id: id++,\n hidden: false,\n children: [],\n extra: person.extra,\n textClass: person.textClass ? person.textClass : opts.styles.text,\n class: person.class ? person.class : opts.styles.node\n };\n\n // hide linages to the hidden root node\n if (parent == root) {\n node.noParent = true;\n }\n\n // apply depth offset\n for (var i = 0; i < person.depthOffset; i++) {\n var pushNode = {\n name: '',\n id: id++,\n hidden: true,\n children: [],\n noParent: node.noParent\n };\n parent.children.push(pushNode);\n parent = pushNode;\n }\n\n // sort children\n dTree._sortPersons(person.children, opts);\n\n // add \"direct\" children\n _.forEach(person.children, function(child) {\n reconstructTree(child, node);\n });\n\n parent.children.push(node);\n\n //sort marriages\n dTree._sortMarriages(person.marriages, opts);\n\n // go through marriage\n _.forEach(person.marriages, function(marriage, index) {\n\n var m = {\n name: '',\n id: id++,\n hidden: true,\n noParent: true,\n children: [],\n extra: marriage.extra\n };\n\n var sp = marriage.spouse;\n\n var spouse = {\n name: sp.name,\n id: id++,\n hidden: false,\n noParent: true,\n children: [],\n textClass: sp.textClass ? sp.textClass : opts.styles.text,\n class: sp.class ? sp.class : opts.styles.node,\n extra: sp.extra,\n marriageNode: m\n };\n\n parent.children.push(m, spouse);\n\n dTree._sortPersons(marriage.children, opts);\n _.forEach(marriage.children, function(child) {\n reconstructTree(child, m);\n });\n\n siblings.push({\n source: {\n id: node.id\n },\n target: {\n id: spouse.id\n },\n number: index\n });\n });\n\n };\n\n _.forEach(data, function(person) {\n reconstructTree(person, root);\n });\n\n return {\n root: d3.hierarchy(root),\n siblings: siblings\n };\n\n },\n\n _sortPersons: function(persons, opts) {\n if (persons != undefined) {\n persons.sort(function(a, b) {\n return opts.callbacks.nodeSorter(a.name, a.extra, b.name, b.extra);\n });\n }\n return persons;\n },\n\n _sortMarriages: function(marriages, opts) {\n if (marriages != undefined && Array.isArray(marriages)) {\n marriages.sort(function(marriageA, marriageB) {\n var a = marriageA.spouse;\n var b = marriageB.spouse;\n return opts.callbacks.nodeSorter(a.name, a.extra, b.name, b.extra);\n });\n }\n return marriages;\n }\n\n};\n\nreturn dTree;\n\n})));\n"]} \ No newline at end of file +{"version":3,"sources":["dTree.min.js","dTree.js"],"names":["_classCallCheck","instance","Constructor","TypeError","_createClass","defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","protoProps","staticProps","prototype","global","factory","exports","module","define","amd","dTree","this","TreeBuilder","root","siblings","opts","DEBUG_LEVEL","debug","allNodes","_flatten","visibleNodes","_","filter","n","hidden","nodeSize","callbacks","nodeWidth","textRenderer","value","width","margin","left","right","height","top","bottom","zoom","d3","scaleExtent","on","svg","attr","event","transform","translate","select","append","call","tree","nodeHeightSeperation","separation","a","b","data","_update","source","treenodes","links","selectAll","enter","l","noParent","styles","linage","_elbow","nodes","descendants","_linkSiblings","marriage","bind","_siblingLine","d","x","cWidth","y","cHeight","id","html","nodeRenderer","name","extra","textClass","nodeClick","recurse","node","children","forEach","push","ny","linedata","fun","line","curve","curveStepAfter","start","v","end","marriageId","marriageNode","find","nodeHeight","number","nodeMaxHeight","maxHeight","tmpSvg","document","createElement","body","appendChild","map","container","setAttribute","style","visibility","maxWidth","text","innerHTML","offsetHeight","removeChild","Math","max","nodeClass","msg","console","log","VERSION","init","options","arguments","undefined","defaultsDeep","_nodeHeightSeperation","_nodeRenderer","_nodeSize","nodeSorter","aName","aExtra","bName","bExtra","_textRenderer","_preprocess","treeBuilder","create","reconstructTree","person","parent","class","depthOffset","pushNode","_sortPersons","child","_sortMarriages","marriages","index","m","sp","spouse","hierarchy","persons","sort","Array","isArray","marriageA","marriageB"],"mappings":"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","file":"dTree.min.js","sourcesContent":["var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : global.dTree = factory();\n})(this, function () {\n 'use strict';\n\n var TreeBuilder = (function () {\n function TreeBuilder(root, siblings, opts) {\n _classCallCheck(this, TreeBuilder);\n\n TreeBuilder.DEBUG_LEVEL = opts.debug ? 1 : 0;\n\n this.root = root;\n this.siblings = siblings;\n this.opts = opts;\n\n // flatten nodes\n this.allNodes = this._flatten(this.root);\n\n // Calculate node size\n var visibleNodes = _.filter(this.allNodes, function (n) {\n return !n.hidden;\n });\n this.nodeSize = opts.callbacks.nodeSize(visibleNodes, opts.nodeWidth, opts.callbacks.textRenderer);\n }\n\n _createClass(TreeBuilder, [{\n key: 'create',\n value: function create() {\n\n var opts = this.opts;\n var allNodes = this.allNodes;\n var nodeSize = this.nodeSize;\n\n var width = opts.width + opts.margin.left + opts.margin.right;\n var height = opts.height + opts.margin.top + opts.margin.bottom;\n\n var zoom = d3.zoom().scaleExtent([0.1, 10]).on('zoom', function () {\n svg.attr('transform', d3.event.transform.translate(width / 2, opts.margin.top));\n });\n\n //make an SVG\n var svg = this.svg = d3.select(opts.target).append('svg').attr('width', width).attr('height', height).call(zoom).append('g').attr('transform', 'translate(' + width / 2 + ',' + opts.margin.top + ')');\n\n // Compute the layout.\n this.tree = d3.tree().nodeSize([nodeSize[0] * 2, opts.callbacks.nodeHeightSeperation(nodeSize[0], nodeSize[1])]);\n\n this.tree.separation(function separation(a, b) {\n if (a.data.hidden || b.data.hidden) {\n return 0.3;\n } else {\n return 0.6;\n }\n });\n\n this._update(this.root);\n }\n }, {\n key: '_update',\n value: function _update(source) {\n\n var opts = this.opts;\n var allNodes = this.allNodes;\n var nodeSize = this.nodeSize;\n\n var treenodes = this.tree(source);\n var links = treenodes.links();\n\n // Create the link lines.\n this.svg.selectAll('.link').data(links).enter()\n // filter links with no parents to prevent empty nodes\n .filter(function (l) {\n return !l.target.data.noParent;\n }).append('path').attr('class', opts.styles.linage).attr('d', this._elbow);\n\n var nodes = this.svg.selectAll('.node').data(treenodes.descendants()).enter();\n\n this._linkSiblings();\n\n // Draw siblings (marriage)\n this.svg.selectAll('.sibling').data(this.siblings).enter().append('path').attr('class', opts.styles.marriage).attr('d', _.bind(this._siblingLine, this));\n\n // Create the node rectangles.\n nodes.append('foreignObject').filter(function (d) {\n return d.data.hidden ? false : true;\n }).attr('x', function (d) {\n return d.x - d.cWidth / 2 + 'px';\n }).attr('y', function (d) {\n return d.y - d.cHeight / 2 + 'px';\n }).attr('width', function (d) {\n return d.cWidth + 'px';\n }).attr('height', function (d) {\n return d.cHeight + 'px';\n }).attr('id', function (d) {\n return d.id;\n }).html(function (d) {\n return opts.callbacks.nodeRenderer(d.data.name, d.x, d.y, nodeSize[0], nodeSize[1], d.data.extra, d.data.id, d.data['class'], d.data.textClass, opts.callbacks.textRenderer);\n }).on('click', function (d) {\n if (d.data.hidden) {\n return;\n }\n opts.callbacks.nodeClick(d.data.name, d.data.extra, d.data.id);\n });\n }\n }, {\n key: '_flatten',\n value: function _flatten(root) {\n var n = [];\n var i = 0;\n\n function recurse(node) {\n if (node.children) {\n node.children.forEach(recurse);\n }\n if (!node.id) {\n node.id = ++i;\n }\n n.push(node);\n }\n recurse(root);\n return n;\n }\n }, {\n key: '_elbow',\n value: function _elbow(d, i) {\n if (d.target.data.noParent) {\n return 'M0,0L0,0';\n }\n var ny = d.target.y + (d.source.y - d.target.y) * 0.50;\n\n var linedata = [{\n x: d.target.x,\n y: d.target.y\n }, {\n x: d.target.x,\n y: ny\n }, {\n x: d.source.x,\n y: d.source.y\n }];\n\n var fun = d3.line().curve(d3.curveStepAfter).x(function (d) {\n return d.x;\n }).y(function (d) {\n return d.y;\n });\n return fun(linedata);\n }\n }, {\n key: '_linkSiblings',\n value: function _linkSiblings() {\n\n var allNodes = this.allNodes;\n\n _.forEach(this.siblings, function (d) {\n var start = allNodes.filter(function (v) {\n return d.source.id == v.data.id;\n });\n var end = allNodes.filter(function (v) {\n return d.target.id == v.data.id;\n });\n d.source.x = start[0].x;\n d.source.y = start[0].y;\n d.target.x = end[0].x;\n d.target.y = end[0].y;\n\n var marriageId = start[0].data.marriageNode != null ? start[0].data.marriageNode.id : end[0].data.marriageNode.id;\n var marriageNode = allNodes.find(function (n) {\n return n.data.id == marriageId;\n });\n d.source.marriageNode = marriageNode;\n d.target.marriageNode = marriageNode;\n });\n }\n }, {\n key: '_siblingLine',\n value: function _siblingLine(d, i) {\n\n var ny = d.target.y + (d.source.y - d.target.y) * 0.50;\n var nodeWidth = this.nodeSize[0];\n var nodeHeight = this.nodeSize[1];\n\n // Not first marriage\n if (d.number > 0) {\n ny -= nodeHeight * 8 / 10;\n }\n\n var linedata = [{\n x: d.source.x,\n y: d.source.y\n }, {\n x: d.source.x + nodeWidth * 6 / 10,\n y: d.source.y\n }, {\n x: d.source.x + nodeWidth * 6 / 10,\n y: ny\n }, {\n x: d.target.marriageNode.x,\n y: ny\n }, {\n x: d.target.marriageNode.x,\n y: d.target.y\n }, {\n x: d.target.x,\n y: d.target.y\n }];\n\n var fun = d3.line().curve(d3.curveStepAfter).x(function (d) {\n return d.x;\n }).y(function (d) {\n return d.y;\n });\n return fun(linedata);\n }\n }], [{\n key: '_nodeHeightSeperation',\n value: function _nodeHeightSeperation(nodeWidth, nodeMaxHeight) {\n return nodeMaxHeight + 25;\n }\n }, {\n key: '_nodeSize',\n value: function _nodeSize(nodes, width, textRenderer) {\n var maxWidth = 0;\n var maxHeight = 0;\n var tmpSvg = document.createElement('svg');\n document.body.appendChild(tmpSvg);\n\n _.map(nodes, function (n) {\n var container = document.createElement('div');\n container.setAttribute('class', n.data['class']);\n container.style.visibility = 'hidden';\n container.style.maxWidth = width + 'px';\n\n var text = textRenderer(n.data.name, n.data.extra, n.data.textClass);\n container.innerHTML = text;\n\n tmpSvg.appendChild(container);\n var height = container.offsetHeight;\n tmpSvg.removeChild(container);\n\n maxHeight = Math.max(maxHeight, height);\n n.cHeight = height;\n if (n.data.hidden) {\n n.cWidth = 0;\n } else {\n n.cWidth = width;\n }\n });\n document.body.removeChild(tmpSvg);\n\n return [width, maxHeight];\n }\n }, {\n key: '_nodeRenderer',\n value: function _nodeRenderer(name, x, y, height, width, extra, id, nodeClass, textClass, textRenderer) {\n var node = '';\n node += '
\\n';\n node += textRenderer(name, extra, textClass);\n node += '
';\n return node;\n }\n }, {\n key: '_textRenderer',\n value: function _textRenderer(name, extra, textClass) {\n var node = '';\n node += '

\\n';\n node += name;\n node += '

\\n';\n return node;\n }\n }, {\n key: '_debug',\n value: function _debug(msg) {\n if (TreeBuilder.DEBUG_LEVEL > 0) {\n console.log(msg);\n }\n }\n }]);\n\n return TreeBuilder;\n })();\n\n var dTree = {\n\n VERSION: '2.1.0',\n\n init: function init(data) {\n var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var opts = _.defaultsDeep(options || {}, {\n target: '#graph',\n debug: false,\n width: 600,\n height: 600,\n callbacks: {\n nodeClick: function nodeClick(name, extra, id) {},\n nodeHeightSeperation: function nodeHeightSeperation(nodeWidth, nodeMaxHeight) {\n return TreeBuilder._nodeHeightSeperation(nodeWidth, nodeMaxHeight);\n },\n nodeRenderer: function nodeRenderer(name, x, y, height, width, extra, id, nodeClass, textClass, textRenderer) {\n return TreeBuilder._nodeRenderer(name, x, y, height, width, extra, id, nodeClass, textClass, textRenderer);\n },\n nodeSize: function nodeSize(nodes, width, textRenderer) {\n return TreeBuilder._nodeSize(nodes, width, textRenderer);\n },\n nodeSorter: function nodeSorter(aName, aExtra, bName, bExtra) {\n return 0;\n },\n textRenderer: function textRenderer(name, extra, textClass) {\n return TreeBuilder._textRenderer(name, extra, textClass);\n }\n },\n margin: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n },\n nodeWidth: 100,\n styles: {\n node: 'node',\n linage: 'linage',\n marriage: 'marriage',\n text: 'nodeText'\n }\n });\n\n var data = this._preprocess(data, opts);\n var treeBuilder = new TreeBuilder(data.root, data.siblings, opts);\n treeBuilder.create();\n },\n\n _preprocess: function _preprocess(data, opts) {\n\n var siblings = [];\n var id = 0;\n\n var root = {\n name: '',\n id: id++,\n hidden: true,\n children: []\n };\n\n var reconstructTree = function reconstructTree(person, parent) {\n\n // convert to person to d3 node\n var node = {\n name: person.name,\n id: id++,\n hidden: false,\n children: [],\n extra: person.extra,\n textClass: person.textClass ? person.textClass : opts.styles.text,\n 'class': person['class'] ? person['class'] : opts.styles.node\n };\n\n // hide linages to the hidden root node\n if (parent == root) {\n node.noParent = true;\n }\n\n // apply depth offset\n for (var i = 0; i < person.depthOffset; i++) {\n var pushNode = {\n name: '',\n id: id++,\n hidden: true,\n children: [],\n noParent: node.noParent\n };\n parent.children.push(pushNode);\n parent = pushNode;\n }\n\n // sort children\n dTree._sortPersons(person.children, opts);\n\n // add \"direct\" children\n _.forEach(person.children, function (child) {\n reconstructTree(child, node);\n });\n\n parent.children.push(node);\n\n //sort marriages\n dTree._sortMarriages(person.marriages, opts);\n\n // go through marriage\n _.forEach(person.marriages, function (marriage, index) {\n\n var m = {\n name: '',\n id: id++,\n hidden: true,\n noParent: true,\n children: [],\n extra: marriage.extra\n };\n\n var sp = marriage.spouse;\n\n var spouse = {\n name: sp.name,\n id: id++,\n hidden: false,\n noParent: true,\n children: [],\n textClass: sp.textClass ? sp.textClass : opts.styles.text,\n 'class': sp['class'] ? sp['class'] : opts.styles.node,\n extra: sp.extra,\n marriageNode: m\n };\n\n parent.children.push(m, spouse);\n\n dTree._sortPersons(marriage.children, opts);\n _.forEach(marriage.children, function (child) {\n reconstructTree(child, m);\n });\n\n siblings.push({\n source: {\n id: node.id\n },\n target: {\n id: spouse.id\n },\n number: index\n });\n });\n };\n\n _.forEach(data, function (person) {\n reconstructTree(person, root);\n });\n\n return {\n root: d3.hierarchy(root),\n siblings: siblings\n };\n },\n\n _sortPersons: function _sortPersons(persons, opts) {\n if (persons != undefined) {\n persons.sort(function (a, b) {\n return opts.callbacks.nodeSorter(a.name, a.extra, b.name, b.extra);\n });\n }\n return persons;\n },\n\n _sortMarriages: function _sortMarriages(marriages, opts) {\n if (marriages != undefined && Array.isArray(marriages)) {\n marriages.sort(function (marriageA, marriageB) {\n var a = marriageA.spouse;\n var b = marriageB.spouse;\n return opts.callbacks.nodeSorter(a.name, a.extra, b.name, b.extra);\n });\n }\n return marriages;\n }\n\n };\n\n return dTree;\n});\n\n","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.dTree = factory());\n}(this, (function () { 'use strict';\n\nclass TreeBuilder {\n\n constructor(root, siblings, opts) {\n TreeBuilder.DEBUG_LEVEL = opts.debug ? 1 : 0;\n\n this.root = root;\n this.siblings = siblings;\n this.opts = opts;\n\n // flatten nodes\n this.allNodes = this._flatten(this.root);\n\n // Calculate node size\n let visibleNodes = _.filter(this.allNodes, function(n) {\n return !n.hidden;\n });\n this.nodeSize = opts.callbacks.nodeSize(visibleNodes,\n opts.nodeWidth, opts.callbacks.textRenderer);\n }\n\n create() {\n\n let opts = this.opts;\n let allNodes = this.allNodes;\n let nodeSize = this.nodeSize;\n\n let width = opts.width + opts.margin.left + opts.margin.right;\n let height = opts.height + opts.margin.top + opts.margin.bottom;\n\n let zoom = d3.zoom()\n .scaleExtent([0.1, 10])\n .on('zoom', function() {\n svg.attr('transform', d3.event.transform.translate(width / 2, opts.margin.top));\n });\n\n //make an SVG\n let svg = this.svg = d3.select(opts.target)\n .append('svg')\n .attr('width', width)\n .attr('height', height)\n .call(zoom)\n .append('g')\n .attr('transform', 'translate(' + width / 2 + ',' + opts.margin.top + ')');\n\n // Compute the layout.\n this.tree = d3.tree()\n .nodeSize([nodeSize[0] * 2,\n opts.callbacks.nodeHeightSeperation(nodeSize[0], nodeSize[1])]);\n\n this.tree.separation(function separation(a, b) {\n if (a.data.hidden || b.data.hidden) {\n return 0.3;\n } else {\n return 0.6;\n }\n });\n\n this._update(this.root);\n\n }\n\n _update(source) {\n\n let opts = this.opts;\n let allNodes = this.allNodes;\n let nodeSize = this.nodeSize;\n\n let treenodes = this.tree(source);\n let links = treenodes.links();\n\n // Create the link lines.\n this.svg.selectAll('.link')\n .data(links)\n .enter()\n // filter links with no parents to prevent empty nodes\n .filter(function(l) {\n return !l.target.data.noParent;\n })\n .append('path')\n .attr('class', opts.styles.linage)\n .attr('d', this._elbow);\n\n let nodes = this.svg.selectAll('.node')\n .data(treenodes.descendants())\n .enter();\n\n this._linkSiblings();\n\n // Draw siblings (marriage)\n this.svg.selectAll('.sibling')\n .data(this.siblings)\n .enter()\n .append('path')\n .attr('class', opts.styles.marriage)\n .attr('d', _.bind(this._siblingLine, this));\n\n // Create the node rectangles.\n nodes.append('foreignObject')\n .filter(function(d) {\n return d.data.hidden ? false : true;\n })\n .attr('x', function(d) {\n return d.x - d.cWidth / 2 + 'px';\n })\n .attr('y', function(d) {\n return d.y - d.cHeight / 2 + 'px';\n })\n .attr('width', function(d) {\n return d.cWidth + 'px';\n })\n .attr('height', function(d) {\n return d.cHeight + 'px';\n })\n .attr('id', function(d) {\n return d.id;\n })\n .html(function(d) {\n return opts.callbacks.nodeRenderer(\n d.data.name,\n d.x,\n d.y,\n nodeSize[0],\n nodeSize[1],\n d.data.extra,\n d.data.id,\n d.data.class,\n d.data.textClass,\n opts.callbacks.textRenderer);\n })\n .on('click', function(d)  {\n if (d.data.hidden) {\n return;\n }\n opts.callbacks.nodeClick(d.data.name, d.data.extra, d.data.id);\n });\n }\n\n _flatten(root) {\n let n = [];\n let i = 0;\n\n function recurse(node) {\n if (node.children) {\n node.children.forEach(recurse);\n }\n if (!node.id) {\n node.id = ++i;\n }\n n.push(node);\n }\n recurse(root);\n return n;\n }\n\n _elbow(d, i) {\n if (d.target.data.noParent) {\n return 'M0,0L0,0';\n }\n let ny = d.target.y + (d.source.y - d.target.y) * 0.50;\n\n let linedata = [{\n x: d.target.x,\n y: d.target.y\n }, {\n x: d.target.x,\n y: ny\n }, {\n x: d.source.x,\n y: d.source.y\n }];\n\n let fun = d3.line().curve(d3.curveStepAfter)\n .x(function(d) {\n return d.x;\n })\n .y(function(d) {\n return d.y;\n });\n return fun(linedata);\n }\n\n _linkSiblings() {\n\n let allNodes = this.allNodes;\n\n _.forEach(this.siblings, function(d) {\n let start = allNodes.filter(function(v) {\n return d.source.id == v.data.id;\n });\n let end = allNodes.filter(function(v) {\n return d.target.id == v.data.id;\n });\n d.source.x = start[0].x;\n d.source.y = start[0].y;\n d.target.x = end[0].x;\n d.target.y = end[0].y;\n\n let marriageId = (start[0].data.marriageNode != null ?\n start[0].data.marriageNode.id :\n end[0].data.marriageNode.id);\n let marriageNode = allNodes.find(function(n) {\n return n.data.id == marriageId;\n });\n d.source.marriageNode = marriageNode;\n d.target.marriageNode = marriageNode;\n });\n\n }\n\n _siblingLine(d, i) {\n\n let ny = d.target.y + (d.source.y - d.target.y) * 0.50;\n let nodeWidth = this.nodeSize[0];\n let nodeHeight = this.nodeSize[1];\n\n // Not first marriage\n if (d.number > 0) {\n ny -= nodeHeight * 8 / 10;\n }\n\n let linedata = [{\n x: d.source.x,\n y: d.source.y\n }, {\n x: d.source.x + nodeWidth * 6 / 10,\n y: d.source.y\n }, {\n x: d.source.x + nodeWidth * 6 / 10,\n y: ny\n }, {\n x: d.target.marriageNode.x,\n y: ny\n }, {\n x: d.target.marriageNode.x,\n y: d.target.y\n }, {\n x: d.target.x,\n y: d.target.y\n }];\n\n let fun = d3.line().curve(d3.curveStepAfter)\n .x(function(d) {\n return d.x;\n })\n .y(function(d) {\n return d.y;\n });\n return fun(linedata);\n }\n\n static _nodeHeightSeperation(nodeWidth, nodeMaxHeight) {\n return nodeMaxHeight + 25;\n }\n\n static _nodeSize(nodes, width, textRenderer) {\n let maxWidth = 0;\n let maxHeight = 0;\n let tmpSvg = document.createElement('svg');\n document.body.appendChild(tmpSvg);\n\n _.map(nodes, function(n) {\n let container = document.createElement('div');\n container.setAttribute('class', n.data.class);\n container.style.visibility = 'hidden';\n container.style.maxWidth = width + 'px';\n\n let text = textRenderer(n.data.name, n.data.extra, n.data.textClass);\n container.innerHTML = text;\n\n tmpSvg.appendChild(container);\n let height = container.offsetHeight;\n tmpSvg.removeChild(container);\n\n maxHeight = Math.max(maxHeight, height);\n n.cHeight = height;\n if (n.data.hidden) {\n n.cWidth = 0;\n } else {\n n.cWidth = width;\n }\n });\n document.body.removeChild(tmpSvg);\n\n return [width, maxHeight];\n }\n\n static _nodeRenderer(name, x, y, height, width, extra, id, nodeClass, textClass, textRenderer) {\n let node = '';\n node += '
\\n';\n node += textRenderer(name, extra, textClass);\n node += '
';\n return node;\n }\n\n static _textRenderer(name, extra, textClass) {\n let node = '';\n node += '

\\n';\n node += name;\n node += '

\\n';\n return node;\n }\n\n static _debug(msg) {\n if (TreeBuilder.DEBUG_LEVEL > 0)  {\n console.log(msg);\n }\n }\n\n}\n\nconst dTree = {\n\n VERSION: '2.1.0',\n\n init: function(data, options = {}) {\n\n var opts = _.defaultsDeep(options || {}, {\n target: '#graph',\n debug: false,\n width: 600,\n height: 600,\n callbacks: {\n nodeClick: function(name, extra, id) {},\n nodeHeightSeperation: function(nodeWidth, nodeMaxHeight) {\n return TreeBuilder._nodeHeightSeperation(nodeWidth, nodeMaxHeight);\n },\n nodeRenderer: function(name, x, y, height, width, extra, id, nodeClass, textClass, textRenderer) {\n return TreeBuilder._nodeRenderer(name, x, y, height, width, extra,\n id,nodeClass, textClass, textRenderer);\n },\n nodeSize: function(nodes, width, textRenderer) {\n return TreeBuilder._nodeSize(nodes, width, textRenderer);\n },\n nodeSorter: function(aName, aExtra, bName, bExtra) {return 0;},\n textRenderer: function(name, extra, textClass) {\n return TreeBuilder._textRenderer(name, extra, textClass);\n },\n },\n margin: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n },\n nodeWidth: 100,\n styles: {\n node: 'node',\n linage: 'linage',\n marriage: 'marriage',\n text: 'nodeText'\n }\n });\n\n var data = this._preprocess(data, opts);\n var treeBuilder = new TreeBuilder(data.root, data.siblings, opts);\n treeBuilder.create();\n\n },\n\n _preprocess: function(data, opts) {\n\n var siblings = [];\n var id = 0;\n\n var root = {\n name: '',\n id: id++,\n hidden: true,\n children: []\n };\n\n var reconstructTree = function(person, parent) {\n\n // convert to person to d3 node\n var node = {\n name: person.name,\n id: id++,\n hidden: false,\n children: [],\n extra: person.extra,\n textClass: person.textClass ? person.textClass : opts.styles.text,\n class: person.class ? person.class : opts.styles.node\n };\n\n // hide linages to the hidden root node\n if (parent == root) {\n node.noParent = true;\n }\n\n // apply depth offset\n for (var i = 0; i < person.depthOffset; i++) {\n var pushNode = {\n name: '',\n id: id++,\n hidden: true,\n children: [],\n noParent: node.noParent\n };\n parent.children.push(pushNode);\n parent = pushNode;\n }\n\n // sort children\n dTree._sortPersons(person.children, opts);\n\n // add \"direct\" children\n _.forEach(person.children, function(child) {\n reconstructTree(child, node);\n });\n\n parent.children.push(node);\n\n //sort marriages\n dTree._sortMarriages(person.marriages, opts);\n\n // go through marriage\n _.forEach(person.marriages, function(marriage, index) {\n\n var m = {\n name: '',\n id: id++,\n hidden: true,\n noParent: true,\n children: [],\n extra: marriage.extra\n };\n\n var sp = marriage.spouse;\n\n var spouse = {\n name: sp.name,\n id: id++,\n hidden: false,\n noParent: true,\n children: [],\n textClass: sp.textClass ? sp.textClass : opts.styles.text,\n class: sp.class ? sp.class : opts.styles.node,\n extra: sp.extra,\n marriageNode: m\n };\n\n parent.children.push(m, spouse);\n\n dTree._sortPersons(marriage.children, opts);\n _.forEach(marriage.children, function(child) {\n reconstructTree(child, m);\n });\n\n siblings.push({\n source: {\n id: node.id\n },\n target: {\n id: spouse.id\n },\n number: index\n });\n });\n\n };\n\n _.forEach(data, function(person) {\n reconstructTree(person, root);\n });\n\n return {\n root: d3.hierarchy(root),\n siblings: siblings\n };\n\n },\n\n _sortPersons: function(persons, opts) {\n if (persons != undefined) {\n persons.sort(function(a, b) {\n return opts.callbacks.nodeSorter(a.name, a.extra, b.name, b.extra);\n });\n }\n return persons;\n },\n\n _sortMarriages: function(marriages, opts) {\n if (marriages != undefined && Array.isArray(marriages)) {\n marriages.sort(function(marriageA, marriageB) {\n var a = marriageA.spouse;\n var b = marriageB.spouse;\n return opts.callbacks.nodeSorter(a.name, a.extra, b.name, b.extra);\n });\n }\n return marriages;\n }\n\n};\n\nreturn dTree;\n\n})));\n"]} \ No newline at end of file diff --git a/gulpfile.js b/gulpfile.js index a89ee05..865c170 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -150,7 +150,7 @@ gulp.task('tag-release', function (cb) { }); gulp.task('commit-changes', function () { - return gulp.src(['./package.json', './CHANGELOG.md', './dist/*', './README.md']) + return gulp.src(['./README.md', './CHANGELOG.md', './dist/*']) .pipe($.git.add()) .pipe($.git.commit('chore: Bump version number')); }); diff --git a/package.json b/package.json index c79c49a..1b788cd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "d3-dtree", - "version": "2.0.2", + "version": "2.1.0", "description": "A library for visualizing data trees built on top of D3.", "main": "dist/dTree.js", "scripts": { @@ -47,7 +47,7 @@ "gulp-eslint": "^1.0.0", "gulp-file": "^0.2.0", "gulp-filter": "^3.0.0", - "gulp-git": "^1.5.0", + "gulp-git": "^2.9.0", "gulp-github-release": "^1.1.0", "gulp-istanbul": "^0.10.0", "gulp-jscs": "^2.0.0", diff --git a/yarn.lock b/yarn.lock index 05cc07e..0ade7b7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -109,6 +109,13 @@ amdefine@>=0.0.4: resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= +ansi-colors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" + integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA== + dependencies: + ansi-wrap "^0.1.0" + ansi-cyan@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" @@ -182,7 +189,7 @@ ansi-styles@~1.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" integrity sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg= -ansi-wrap@0.1.0: +ansi-wrap@0.1.0, ansi-wrap@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768= @@ -1186,11 +1193,21 @@ cliui@^2.1.0: right-align "^0.1.1" wordwrap "0.0.2" +clone-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" + integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= + clone-stats@^0.0.1, clone-stats@~0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" integrity sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE= +clone-stats@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" + integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= + clone@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" @@ -1201,6 +1218,20 @@ clone@^1.0.0, clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= +clone@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + +cloneable-readable@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.2.tgz#d591dee4a8f8bc15da43ce97dceeba13d43e2a65" + integrity sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg== + dependencies: + inherits "^2.0.1" + process-nextick-args "^2.0.0" + readable-stream "^2.3.5" + code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" @@ -2797,6 +2828,13 @@ first-chunk-stream@^1.0.0: resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" integrity sha1-Wb+1DNkF9g18OUzT2ayqtOatk04= +first-chunk-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz#1bdecdb8e083c0664b91945581577a43a9f31d70" + integrity sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA= + dependencies: + readable-stream "^2.0.2" + flagged-respawn@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41" @@ -3232,15 +3270,19 @@ gulp-filter@^3.0.0: multimatch "^2.0.0" streamfilter "^1.0.5" -gulp-git@^1.5.0: - version "1.15.1" - resolved "https://registry.yarnpkg.com/gulp-git/-/gulp-git-1.15.1.tgz#cdd9d354fc41d8dcb52cef47256dfba366785979" - integrity sha1-zdnTVPxB2Ny1LO9HJW37o2Z4WXk= +gulp-git@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/gulp-git/-/gulp-git-2.9.0.tgz#f1ea6528d855f5e9cd4d712913131214f5088b58" + integrity sha512-66ZCwlCCf0YXEUedDbx76p0ii6aQ6aUHC4oSytn3UM8J6VWJKYF4PBARMIgR/POGWyYeN7hjd81Elpjn/o4+Tg== dependencies: any-shell-escape "^0.1.1" - gulp-util "^3.0.6" - require-dir "^0.1.0" - through2 "^0.6.5" + fancy-log "^1.3.2" + lodash.template "^4.4.0" + plugin-error "^1.0.1" + require-dir "^1.0.0" + strip-bom-stream "^3.0.0" + through2 "^2.0.3" + vinyl "^2.0.1" gulp-github-release@^1.1.0: version "1.2.1" @@ -4060,7 +4102,7 @@ is-url@^1.1.0: resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== -is-utf8@^0.2.0: +is-utf8@^0.2.0, is-utf8@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= @@ -4669,7 +4711,7 @@ lodash._reinterpolate@^2.4.1, lodash._reinterpolate@~2.4.1: resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz#4f1227aa5a8711fc632f5b07a1f4607aab8b3222" integrity sha1-TxInqlqHEfxjL1sHofRgequLMiI= -lodash._reinterpolate@^3.0.0: +lodash._reinterpolate@^3.0.0, lodash._reinterpolate@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= @@ -4891,6 +4933,14 @@ lodash.template@^3.0.0, lodash.template@^3.6.1: lodash.restparam "^3.0.0" lodash.templatesettings "^3.0.0" +lodash.template@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" + integrity sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A= + dependencies: + lodash._reinterpolate "~3.0.0" + lodash.templatesettings "^4.0.0" + lodash.templatesettings@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" @@ -4899,6 +4949,13 @@ lodash.templatesettings@^3.0.0: lodash._reinterpolate "^3.0.0" lodash.escape "^3.0.0" +lodash.templatesettings@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" + integrity sha1-K01OlbpEDZFf8IvImeRVNmZxMxY= + dependencies: + lodash._reinterpolate "~3.0.0" + lodash.templatesettings@~2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz#ea76c75d11eb86d4dbe89a83893bb861929ac699" @@ -5417,7 +5474,7 @@ nomnom@^1.5.x: chalk "~0.4.0" underscore "~1.6.0" -"nomnom@github:douglasduteil/nomnom#next": +nomnom@douglasduteil/nomnom#next: version "1.8.1" resolved "https://codeload.github.com/douglasduteil/nomnom/tar.gz/96ec52cb430e608a0eadc55c760eeb57dad9a1d8" dependencies: @@ -5933,6 +5990,16 @@ plugin-error@^0.1.2: arr-union "^2.0.1" extend-shallow "^1.1.2" +plugin-error@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" + integrity sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA== + dependencies: + ansi-colors "^1.0.1" + arr-diff "^4.0.0" + arr-union "^3.1.0" + extend-shallow "^3.0.2" + plugin-log@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/plugin-log/-/plugin-log-0.1.0.tgz#86049cf6ab10833398a931f3689cbaee7b5e1333" @@ -5976,7 +6043,7 @@ private@^0.1.6, private@~0.1.5: resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== -process-nextick-args@~2.0.0: +process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== @@ -6404,6 +6471,11 @@ replace-ext@0.0.1: resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" integrity sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ= +replace-ext@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" + integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= + replacestream@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/replacestream/-/replacestream-4.0.3.tgz#3ee5798092be364b1cdb1484308492cb3dff2f36" @@ -6439,10 +6511,10 @@ request@^2.54.0: tunnel-agent "^0.6.0" uuid "^3.3.2" -require-dir@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/require-dir/-/require-dir-0.1.0.tgz#81e01e299faf5b74c34b6594f8e5add5985ddec5" - integrity sha1-geAeKZ+vW3TDS2WU+OWt1Zhd3sU= +require-dir@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/require-dir/-/require-dir-1.2.0.tgz#0d443b75e96012d3ca749cf19f529a789ae74817" + integrity sha512-LY85DTSu+heYgDqq/mK+7zFHWkttVNRXC9NKcKGyuGLdlsfbjEPrIEYdCVrx6hqnJb+xSu3Lzaoo8VnmOhhjNA== reserved-words@^0.1.1: version "0.1.2" @@ -7107,6 +7179,21 @@ strip-ansi@~0.1.0: resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" integrity sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE= +strip-bom-buf@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz#1cb45aaf57530f4caf86c7f75179d2c9a51dd572" + integrity sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI= + dependencies: + is-utf8 "^0.2.1" + +strip-bom-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-3.0.0.tgz#956bcc5d84430f69256a90ed823765cd858e159c" + integrity sha1-lWvMXYRDD2klapDtgjdlzYWOFZw= + dependencies: + first-chunk-stream "^2.0.0" + strip-bom-buf "^1.0.0" + strip-bom@2.X, strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -7255,7 +7342,7 @@ through2@^0.5.0, through2@^0.5.1, through2@~0.5.1: readable-stream "~1.0.17" xtend "~3.0.0" -through2@^0.6.1, through2@^0.6.3, through2@^0.6.5, through2@~0.6.3: +through2@^0.6.1, through2@^0.6.3, through2@~0.6.3: version "0.6.5" resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg= @@ -7694,6 +7781,18 @@ vinyl@^0.5.0: clone-stats "^0.0.1" replace-ext "0.0.1" +vinyl@^2.0.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86" + integrity sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg== + dependencies: + clone "^2.1.1" + clone-buffer "^1.0.0" + clone-stats "^1.0.0" + cloneable-readable "^1.0.0" + remove-trailing-separator "^1.0.1" + replace-ext "^1.0.0" + vm-browserify@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019"