You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

1131 lines
32 KiB

(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define([], factory);
else if(typeof exports === 'object')
exports["Hierarchy"] = factory();
else
root["Hierarchy"] = factory();
})(typeof self !== 'undefined' ? self : this, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 5);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports) {
/**
* Get average height or height for node's position calculation, according to align.
* @param {*} preNode previous node
* @param {*} node current node, whose position is going to be calculated
* @param {'center' | undefined} align 'center' means nodes align at the center, other value means align at the left-top
* @param {string} heightField field name for height value on preNode and node
* @return {number} the height for calculation
*/
function getHeight(preNode, node, align, heightField) {
if (heightField === void 0) {
heightField = 'height';
}
return align === 'center' ? (preNode[heightField] + node[heightField]) / 2 : preNode.height;
}
module.exports = {
assign: Object.assign,
getHeight: getHeight
};
/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) {
var hierarchy = __webpack_require__(3);
var Layout = /*#__PURE__*/function () {
function Layout(root, options) {
if (options === void 0) {
options = {};
}
var me = this;
me.options = options;
me.rootNode = hierarchy(root, options);
}
var _proto = Layout.prototype;
_proto.execute = function execute() {
throw new Error('please override this method');
};
return Layout;
}();
module.exports = Layout;
/***/ }),
/* 2 */
/***/ (function(module, exports, __webpack_require__) {
var separateTree = __webpack_require__(4);
var VALID_DIRECTIONS = ['LR',
// left to right
'RL',
// right to left
'TB',
// top to bottom
'BT',
// bottom to top
'H',
// horizontal
'V' // vertical
];
var HORIZONTAL_DIRECTIONS = ['LR', 'RL', 'H'];
var isHorizontal = function isHorizontal(direction) {
return HORIZONTAL_DIRECTIONS.indexOf(direction) > -1;
};
var DEFAULT_DIRECTION = VALID_DIRECTIONS[0];
module.exports = function (root, options, layoutAlgrithm) {
var direction = options.direction || DEFAULT_DIRECTION;
options.isHorizontal = isHorizontal(direction);
if (direction && VALID_DIRECTIONS.indexOf(direction) === -1) {
throw new TypeError("Invalid direction: " + direction);
}
if (direction === VALID_DIRECTIONS[0]) {
// LR
layoutAlgrithm(root, options);
} else if (direction === VALID_DIRECTIONS[1]) {
// RL
layoutAlgrithm(root, options);
root.right2left();
} else if (direction === VALID_DIRECTIONS[2]) {
// TB
layoutAlgrithm(root, options);
} else if (direction === VALID_DIRECTIONS[3]) {
// BT
layoutAlgrithm(root, options);
root.bottom2top();
} else if (direction === VALID_DIRECTIONS[4] || direction === VALID_DIRECTIONS[5]) {
// H or V
// separate into left and right trees
var _separateTree = separateTree(root, options),
left = _separateTree.left,
right = _separateTree.right;
// do layout for left and right trees
layoutAlgrithm(left, options);
layoutAlgrithm(right, options);
options.isHorizontal ? left.right2left() : left.bottom2top();
// combine left and right trees
right.translate(left.x - right.x, left.y - right.y);
// translate root
root.x = left.x;
root.y = right.y;
var bb = root.getBoundingBox();
if (options.isHorizontal) {
if (bb.top < 0) {
root.translate(0, -bb.top);
}
} else {
if (bb.left < 0) {
root.translate(-bb.left, 0);
}
}
}
// fixed root position, default value is true
var fixedRoot = options.fixedRoot;
if (fixedRoot === undefined) fixedRoot = true;
if (fixedRoot) {
root.translate(-(root.x + root.width / 2 + root.hgap), -(root.y + root.height / 2 + root.vgap));
}
reassignXYIfRadial(root, options);
return root;
};
function reassignXYIfRadial(root, options) {
if (options.radial) {
var _ref = options.isHorizontal ? ["x", "y"] : ["y", "x"],
rScale = _ref[0],
radScale = _ref[1];
var min = {
x: Infinity,
y: Infinity
};
var max = {
x: -Infinity,
y: -Infinity
};
var count = 0;
root.DFTraverse(function (node) {
count++;
var x = node.x,
y = node.y;
min.x = Math.min(min.x, x);
min.y = Math.min(min.y, y);
max.x = Math.max(max.x, x);
max.y = Math.max(max.y, y);
});
var radDiff = max[radScale] - min[radScale];
if (radDiff === 0) return;
var avgRad = Math.PI * 2 / count;
root.DFTraverse(function (node) {
var rad = (node[radScale] - min[radScale]) / radDiff * (Math.PI * 2 - avgRad) + avgRad;
var r = node[rScale] - root[rScale];
node.x = Math.cos(rad) * r;
node.y = Math.sin(rad) * r;
});
}
}
/***/ }),
/* 3 */
/***/ (function(module, exports, __webpack_require__) {
/* eslint-disable no-cond-assign */
var util = __webpack_require__(0);
var PEM = 18;
var DEFAULT_HEIGHT = PEM * 2;
var DEFAULT_GAP = PEM;
var DEFAULT_OPTIONS = {
getId: function getId(d) {
return d.id || d.name;
},
getPreH: function getPreH(d) {
return d.preH || 0;
},
getPreV: function getPreV(d) {
return d.preV || 0;
},
getHGap: function getHGap(d) {
return d.hgap || DEFAULT_GAP;
},
getVGap: function getVGap(d) {
return d.vgap || DEFAULT_GAP;
},
getChildren: function getChildren(d) {
return d.children;
},
getHeight: function getHeight(d) {
return d.height || DEFAULT_HEIGHT;
},
getWidth: function getWidth(d) {
var label = d.label || ' ';
return d.width || label.split('').length * PEM; // FIXME DO NOT get width like this
}
};
function Node(data, options) {
var me = this;
me.vgap = me.hgap = 0;
if (data instanceof Node) return data;
me.data = data;
/*
* Gaps: filling space between nodes
* (x, y) ----------------------
* | vgap |
* | -------------------- h
* | h | | e
* | g | | i
* | a | | g
* | p | | h
* | --------------------- t
* | |
* -----------width------------
*/
var hgap = options.getHGap(data);
var vgap = options.getVGap(data);
me.preH = options.getPreH(data);
me.preV = options.getPreV(data);
me.width = options.getWidth(data);
me.height = options.getHeight(data);
me.width += me.preH;
me.height += me.preV;
me.id = options.getId(data);
me.x = me.y = 0;
me.depth = 0;
if (!me.children) {
me.children = [];
}
me.addGap(hgap, vgap);
return me;
}
util.assign(Node.prototype, {
isRoot: function isRoot() {
return this.depth === 0;
},
isLeaf: function isLeaf() {
return this.children.length === 0;
},
addGap: function addGap(hgap, vgap) {
var me = this;
me.hgap += hgap;
me.vgap += vgap;
me.width += 2 * hgap;
me.height += 2 * vgap;
},
eachNode: function eachNode(callback) {
// Depth First traverse
var me = this;
var nodes = [me];
var current;
while (current = nodes.shift()) {
callback(current);
nodes = current.children.concat(nodes);
}
},
DFTraverse: function DFTraverse(callback) {
// Depth First traverse
this.eachNode(callback);
},
BFTraverse: function BFTraverse(callback) {
// Breadth First traverse
var me = this;
var nodes = [me];
var current;
while (current = nodes.shift()) {
callback(current);
nodes = nodes.concat(current.children);
}
},
getBoundingBox: function getBoundingBox() {
// BBox for just one tree node
var bb = {
left: Number.MAX_VALUE,
top: Number.MAX_VALUE,
width: 0,
height: 0
};
this.eachNode(function (node) {
bb.left = Math.min(bb.left, node.x);
bb.top = Math.min(bb.top, node.y);
bb.width = Math.max(bb.width, node.x + node.width);
bb.height = Math.max(bb.height, node.y + node.height);
});
return bb;
},
// translate
translate: function translate(tx, ty) {
if (tx === void 0) {
tx = 0;
}
if (ty === void 0) {
ty = 0;
}
this.eachNode(function (node) {
node.x += tx;
node.y += ty;
node.x += node.preH;
node.y += node.preV;
});
},
right2left: function right2left() {
var me = this;
var bb = me.getBoundingBox();
me.eachNode(function (node) {
node.x = node.x - (node.x - bb.left) * 2 - node.width;
// node.x = - node.x;
});
me.translate(bb.width, 0);
},
bottom2top: function bottom2top() {
var me = this;
var bb = me.getBoundingBox();
me.eachNode(function (node) {
node.y = node.y - (node.y - bb.top) * 2 - node.height;
// node.y = - node.y;
});
me.translate(0, bb.height);
}
});
function hierarchy(data, options, isolated) {
if (options === void 0) {
options = {};
}
options = util.assign({}, DEFAULT_OPTIONS, options);
var root = new Node(data, options);
var nodes = [root];
var node;
if (!isolated && !data.collapsed) {
while (node = nodes.shift()) {
if (!node.data.collapsed) {
var children = options.getChildren(node.data);
var length = children ? children.length : 0;
node.children = new Array(length);
if (children && length) {
for (var i = 0; i < length; i++) {
var child = new Node(children[i], options);
node.children[i] = child;
nodes.push(child);
child.parent = node;
child.depth = node.depth + 1;
}
}
}
}
}
return root;
}
module.exports = hierarchy;
/***/ }),
/* 4 */
/***/ (function(module, exports, __webpack_require__) {
var hierarchy = __webpack_require__(3);
module.exports = function (root, options) {
// separate into left and right trees
var left = hierarchy(root.data, options, true); // root only
var right = hierarchy(root.data, options, true); // root only
// automatically
var treeSize = root.children.length;
var rightTreeSize = Math.round(treeSize / 2);
// separate left and right tree by meta data
var getSide = options.getSide || function (child, index) {
if (index < rightTreeSize) {
return 'right';
}
return 'left';
};
for (var i = 0; i < treeSize; i++) {
var child = root.children[i];
var side = getSide(child, i);
if (side === 'right') {
right.children.push(child);
} else {
left.children.push(child);
}
}
left.eachNode(function (node) {
if (!node.isRoot()) {
node.side = 'left';
}
});
right.eachNode(function (node) {
if (!node.isRoot()) {
node.side = 'right';
}
});
return {
left: left,
right: right
};
};
/***/ }),
/* 5 */
/***/ (function(module, exports, __webpack_require__) {
var hierarchy = {
compactBox: __webpack_require__(6),
dendrogram: __webpack_require__(8),
indented: __webpack_require__(10),
mindmap: __webpack_require__(12)
};
module.exports = hierarchy;
/***/ }),
/* 6 */
/***/ (function(module, exports, __webpack_require__) {
function _inheritsLoose(t, o) { t.prototype = Object.create(o.prototype), t.prototype.constructor = t, _setPrototypeOf(t, o); }
function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
var TreeLayout = __webpack_require__(1);
var nonLayeredTidyTree = __webpack_require__(7);
var doTreeLayout = __webpack_require__(2);
var util = __webpack_require__(0);
var CompactBoxTreeLayout = /*#__PURE__*/function (_TreeLayout) {
function CompactBoxTreeLayout() {
return _TreeLayout.apply(this, arguments) || this;
}
_inheritsLoose(CompactBoxTreeLayout, _TreeLayout);
var _proto = CompactBoxTreeLayout.prototype;
_proto.execute = function execute() {
var me = this;
return doTreeLayout(me.rootNode, me.options, nonLayeredTidyTree);
};
return CompactBoxTreeLayout;
}(TreeLayout);
var DEFAULT_OPTIONS = {};
function compactBoxLayout(root, options) {
options = util.assign({}, DEFAULT_OPTIONS, options);
return new CompactBoxTreeLayout(root, options).execute();
}
module.exports = compactBoxLayout;
/***/ }),
/* 7 */
/***/ (function(module, exports) {
// wrap tree node
function WrappedTree(w, h, y, c) {
if (c === void 0) {
c = [];
}
var me = this;
// size
me.w = w || 0;
me.h = h || 0;
// position
me.y = y || 0;
me.x = 0;
// children
me.c = c || [];
me.cs = c.length;
// modified
me.prelim = 0;
me.mod = 0;
me.shift = 0;
me.change = 0;
// left/right tree
me.tl = null;
me.tr = null;
// extreme left/right tree
me.el = null;
me.er = null;
// modified left/right tree
me.msel = 0;
me.mser = 0;
}
WrappedTree.fromNode = function (root, isHorizontal) {
if (!root) return null;
var children = [];
root.children.forEach(function (child) {
children.push(WrappedTree.fromNode(child, isHorizontal));
});
if (isHorizontal) return new WrappedTree(root.height, root.width, root.x, children);
return new WrappedTree(root.width, root.height, root.y, children);
};
// node utils
function moveRight(node, move, isHorizontal) {
if (isHorizontal) {
node.y += move;
} else {
node.x += move;
}
node.children.forEach(function (child) {
moveRight(child, move, isHorizontal);
});
}
function getMin(node, isHorizontal) {
var res = isHorizontal ? node.y : node.x;
node.children.forEach(function (child) {
res = Math.min(getMin(child, isHorizontal), res);
});
return res;
}
function normalize(node, isHorizontal) {
var min = getMin(node, isHorizontal);
moveRight(node, -min, isHorizontal);
}
function convertBack(converted /* WrappedTree */, root /* TreeNode */, isHorizontal) {
if (isHorizontal) {
root.y = converted.x;
} else {
root.x = converted.x;
}
converted.c.forEach(function (child, i) {
convertBack(child, root.children[i], isHorizontal);
});
}
function layer(node, isHorizontal, d) {
if (d === void 0) {
d = 0;
}
if (isHorizontal) {
node.x = d;
d += node.width;
} else {
node.y = d;
d += node.height;
}
node.children.forEach(function (child) {
layer(child, isHorizontal, d);
});
}
module.exports = function (root, options) {
if (options === void 0) {
options = {};
}
var isHorizontal = options.isHorizontal;
function firstWalk(t) {
if (t.cs === 0) {
setExtremes(t);
return;
}
firstWalk(t.c[0]);
var ih = updateIYL(bottom(t.c[0].el), 0, null);
for (var i = 1; i < t.cs; ++i) {
firstWalk(t.c[i]);
var min = bottom(t.c[i].er);
separate(t, i, ih);
ih = updateIYL(min, i, ih);
}
positionRoot(t);
setExtremes(t);
}
function setExtremes(t) {
if (t.cs === 0) {
t.el = t;
t.er = t;
t.msel = t.mser = 0;
} else {
t.el = t.c[0].el;
t.msel = t.c[0].msel;
t.er = t.c[t.cs - 1].er;
t.mser = t.c[t.cs - 1].mser;
}
}
function separate(t, i, ih) {
var sr = t.c[i - 1];
var mssr = sr.mod;
var cl = t.c[i];
var mscl = cl.mod;
while (sr !== null && cl !== null) {
if (bottom(sr) > ih.low) ih = ih.nxt;
var dist = mssr + sr.prelim + sr.w - (mscl + cl.prelim);
if (dist > 0) {
mscl += dist;
moveSubtree(t, i, ih.index, dist);
}
var sy = bottom(sr);
var cy = bottom(cl);
if (sy <= cy) {
sr = nextRightContour(sr);
if (sr !== null) mssr += sr.mod;
}
if (sy >= cy) {
cl = nextLeftContour(cl);
if (cl !== null) mscl += cl.mod;
}
}
if (!sr && !!cl) {
setLeftThread(t, i, cl, mscl);
} else if (!!sr && !cl) {
setRightThread(t, i, sr, mssr);
}
}
function moveSubtree(t, i, si, dist) {
t.c[i].mod += dist;
t.c[i].msel += dist;
t.c[i].mser += dist;
distributeExtra(t, i, si, dist);
}
function nextLeftContour(t) {
return t.cs === 0 ? t.tl : t.c[0];
}
function nextRightContour(t) {
return t.cs === 0 ? t.tr : t.c[t.cs - 1];
}
function bottom(t) {
return t.y + t.h;
}
function setLeftThread(t, i, cl, modsumcl) {
var li = t.c[0].el;
li.tl = cl;
var diff = modsumcl - cl.mod - t.c[0].msel;
li.mod += diff;
li.prelim -= diff;
t.c[0].el = t.c[i].el;
t.c[0].msel = t.c[i].msel;
}
function setRightThread(t, i, sr, modsumsr) {
var ri = t.c[i].er;
ri.tr = sr;
var diff = modsumsr - sr.mod - t.c[i].mser;
ri.mod += diff;
ri.prelim -= diff;
t.c[i].er = t.c[i - 1].er;
t.c[i].mser = t.c[i - 1].mser;
}
function positionRoot(t) {
t.prelim = (t.c[0].prelim + t.c[0].mod + t.c[t.cs - 1].mod + t.c[t.cs - 1].prelim + t.c[t.cs - 1].w) / 2 - t.w / 2;
}
function secondWalk(t, modsum) {
modsum += t.mod;
t.x = t.prelim + modsum;
addChildSpacing(t);
for (var i = 0; i < t.cs; i++) {
secondWalk(t.c[i], modsum);
}
}
function distributeExtra(t, i, si, dist) {
if (si !== i - 1) {
var nr = i - si;
t.c[si + 1].shift += dist / nr;
t.c[i].shift -= dist / nr;
t.c[i].change -= dist - dist / nr;
}
}
function addChildSpacing(t) {
var d = 0;
var modsumdelta = 0;
for (var i = 0; i < t.cs; i++) {
d += t.c[i].shift;
modsumdelta += d + t.c[i].change;
t.c[i].mod += modsumdelta;
}
}
function updateIYL(low, index, ih) {
while (ih !== null && low >= ih.low) {
ih = ih.nxt;
}
return {
low: low,
index: index,
nxt: ih
};
}
// do layout
layer(root, isHorizontal);
var wt = WrappedTree.fromNode(root, isHorizontal);
firstWalk(wt);
secondWalk(wt, 0);
convertBack(wt, root, isHorizontal);
normalize(root, isHorizontal);
return root;
};
/***/ }),
/* 8 */
/***/ (function(module, exports, __webpack_require__) {
function _inheritsLoose(t, o) { t.prototype = Object.create(o.prototype), t.prototype.constructor = t, _setPrototypeOf(t, o); }
function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
var TreeLayout = __webpack_require__(1);
var dendrogram = __webpack_require__(9);
var doTreeLayout = __webpack_require__(2);
var util = __webpack_require__(0);
var DendrogramLayout = /*#__PURE__*/function (_TreeLayout) {
function DendrogramLayout() {
return _TreeLayout.apply(this, arguments) || this;
}
_inheritsLoose(DendrogramLayout, _TreeLayout);
var _proto = DendrogramLayout.prototype;
_proto.execute = function execute() {
var me = this;
me.rootNode.width = 0;
return doTreeLayout(me.rootNode, me.options, dendrogram);
};
return DendrogramLayout;
}(TreeLayout);
var DEFAULT_OPTIONS = {};
function dendrogramLayout(root, options) {
options = util.assign({}, DEFAULT_OPTIONS, options);
return new DendrogramLayout(root, options).execute();
}
module.exports = dendrogramLayout;
/***/ }),
/* 9 */
/***/ (function(module, exports, __webpack_require__) {
// wrap tree node
// TODO considering size
var util = __webpack_require__(0);
function WrappedTree(height, children) {
if (height === void 0) {
height = 0;
}
if (children === void 0) {
children = [];
}
var me = this;
me.x = me.y = 0;
me.leftChild = me.rightChild = null;
me.height = 0;
me.children = children;
}
var DEFAULT_OPTIONS = {
isHorizontal: true,
nodeSep: 20,
nodeSize: 20,
rankSep: 200,
subTreeSep: 10
};
function convertBack(converted /* WrappedTree */, root /* TreeNode */, isHorizontal) {
if (isHorizontal) {
root.x = converted.x;
root.y = converted.y;
} else {
root.x = converted.y;
root.y = converted.x;
}
converted.children.forEach(function (child, i) {
convertBack(child, root.children[i], isHorizontal);
});
}
module.exports = function (root, options) {
if (options === void 0) {
options = {};
}
options = util.assign({}, DEFAULT_OPTIONS, options);
var maxDepth = 0;
function wrappedTreeFromNode(n) {
if (!n) return null;
n.width = 0;
if (n.depth && n.depth > maxDepth) {
maxDepth = n.depth; // get the max depth
}
var children = n.children;
var childrenCount = children.length;
var t = new WrappedTree(n.height, []);
children.forEach(function (child, i) {
var childWT = wrappedTreeFromNode(child);
t.children.push(childWT);
if (i === 0) {
// t.leftChild = childWT.leftChild ? childWT.leftChild : childWT
t.leftChild = childWT;
}
if (i === childrenCount - 1) {
// t.rightChild = childWT.rightChild ? childWT.rightChild : childWT
t.rightChild = childWT;
}
});
t.originNode = n;
t.isLeaf = n.isLeaf();
return t;
}
function getDrawingDepth(t) {
if (t.isLeaf || t.children.length === 0) {
t.drawingDepth = maxDepth;
} else {
var depths = t.children.map(function (child) {
return getDrawingDepth(child);
});
var minChildDepth = Math.min.apply(null, depths);
t.drawingDepth = minChildDepth - 1;
}
return t.drawingDepth;
}
var prevLeaf;
function position(t) {
t.x = t.drawingDepth * options.rankSep;
if (t.isLeaf) {
t.y = 0;
if (prevLeaf) {
t.y = prevLeaf.y + prevLeaf.height + options.nodeSep;
if (t.originNode.parent !== prevLeaf.originNode.parent) {
t.y += options.subTreeSep;
}
}
prevLeaf = t;
} else {
t.children.forEach(function (child) {
position(child);
});
t.y = (t.leftChild.y + t.rightChild.y) / 2;
}
}
// wrap node
var wt = wrappedTreeFromNode(root);
// get depth for drawing
getDrawingDepth(wt);
// get position
position(wt);
// get x, y
convertBack(wt, root, options.isHorizontal);
return root;
};
/***/ }),
/* 10 */
/***/ (function(module, exports, __webpack_require__) {
function _inheritsLoose(t, o) { t.prototype = Object.create(o.prototype), t.prototype.constructor = t, _setPrototypeOf(t, o); }
function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
var TreeLayout = __webpack_require__(1);
var indentedTree = __webpack_require__(11);
var separateTree = __webpack_require__(4);
var util = __webpack_require__(0);
var VALID_DIRECTIONS = ['LR',
// left to right
'RL',
// right to left
'H' // horizontal
];
var DEFAULT_DIRECTION = VALID_DIRECTIONS[0];
var IndentedLayout = /*#__PURE__*/function (_TreeLayout) {
function IndentedLayout() {
return _TreeLayout.apply(this, arguments) || this;
}
_inheritsLoose(IndentedLayout, _TreeLayout);
var _proto = IndentedLayout.prototype;
_proto.execute = function execute() {
var me = this;
var options = me.options;
var root = me.rootNode;
options.isHorizontal = true;
// default indent 20 and sink first children;
var _options$indent = options.indent,
indent = _options$indent === void 0 ? 20 : _options$indent,
_options$dropCap = options.dropCap,
dropCap = _options$dropCap === void 0 ? true : _options$dropCap,
_options$direction = options.direction,
direction = _options$direction === void 0 ? DEFAULT_DIRECTION : _options$direction,
align = options.align;
if (direction && VALID_DIRECTIONS.indexOf(direction) === -1) {
throw new TypeError("Invalid direction: " + direction);
}
if (direction === VALID_DIRECTIONS[0]) {
// LR
indentedTree(root, indent, dropCap, align);
} else if (direction === VALID_DIRECTIONS[1]) {
// RL
indentedTree(root, indent, dropCap, align);
root.right2left();
} else if (direction === VALID_DIRECTIONS[2]) {
// H
// separate into left and right trees
var _separateTree = separateTree(root, options),
left = _separateTree.left,
right = _separateTree.right;
indentedTree(left, indent, dropCap, align);
left.right2left();
indentedTree(right, indent, dropCap, align);
var bbox = left.getBoundingBox();
right.translate(bbox.width, 0);
root.x = right.x - root.width / 2;
}
return root;
};
return IndentedLayout;
}(TreeLayout);
var DEFAULT_OPTIONS = {};
function indentedLayout(root, options) {
options = util.assign({}, DEFAULT_OPTIONS, options);
return new IndentedLayout(root, options).execute();
}
module.exports = indentedLayout;
/***/ }),
/* 11 */
/***/ (function(module, exports, __webpack_require__) {
var util = __webpack_require__(0);
function positionNode(node, previousNode, indent, dropCap, align) {
// caculate the node's horizontal offset DX, dx's type might be number or function
var displacementX = (typeof indent === "function" ? indent(node) : indent) * node.depth;
if (!dropCap) {
try {
if (node.id === node.parent.children[0].id) {
node.x += displacementX;
node.y = previousNode ? previousNode.y : 0;
return;
}
} catch (e) {
// skip to normal when a node has no parent
}
}
node.x += displacementX;
if (previousNode) {
node.y = previousNode.y + util.getHeight(previousNode, node, align);
if (previousNode.parent && node.parent.id !== previousNode.parent.id) {
// previous node has different parent
var prevParent = previousNode.parent;
var preY = prevParent.y + util.getHeight(prevParent, node, align);
node.y = preY > node.y ? preY : node.y;
}
} else {
node.y = 0;
}
return;
}
module.exports = function (root, indent, dropCap, align) {
var previousNode = null;
root.eachNode(function (node) {
positionNode(node, previousNode, indent, dropCap, align);
previousNode = node;
});
};
/***/ }),
/* 12 */
/***/ (function(module, exports, __webpack_require__) {
function _inheritsLoose(t, o) { t.prototype = Object.create(o.prototype), t.prototype.constructor = t, _setPrototypeOf(t, o); }
function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
var TreeLayout = __webpack_require__(1);
var mindmap = __webpack_require__(13);
var doTreeLayout = __webpack_require__(2);
var util = __webpack_require__(0);
var MindmapLayout = /*#__PURE__*/function (_TreeLayout) {
function MindmapLayout() {
return _TreeLayout.apply(this, arguments) || this;
}
_inheritsLoose(MindmapLayout, _TreeLayout);
var _proto = MindmapLayout.prototype;
_proto.execute = function execute() {
var me = this;
return doTreeLayout(me.rootNode, me.options, mindmap);
};
return MindmapLayout;
}(TreeLayout);
var DEFAULT_OPTIONS = {};
function mindmapLayout(root, options) {
options = util.assign({}, DEFAULT_OPTIONS, options);
return new MindmapLayout(root, options).execute();
}
module.exports = mindmapLayout;
/***/ }),
/* 13 */
/***/ (function(module, exports, __webpack_require__) {
var util = __webpack_require__(0);
function secondWalk(node, options) {
var totalHeight = 0;
if (!node.children.length) {
totalHeight = node.height;
} else {
node.children.forEach(function (c) {
totalHeight += secondWalk(c, options);
});
}
node._subTreeSep = options.getSubTreeSep(node.data);
node.totalHeight = Math.max(node.height, totalHeight) + 2 * node._subTreeSep;
return node.totalHeight;
}
function thirdWalk(node) {
var children = node.children;
var len = children.length;
if (len) {
children.forEach(function (c) {
thirdWalk(c);
});
var first = children[0];
var last = children[len - 1];
var childrenHeight = last.y - first.y + last.height;
var childrenTotalHeight = 0;
children.forEach(function (child) {
childrenTotalHeight += child.totalHeight;
});
if (childrenHeight > node.height) {
// 当子节点总高度大于父节点高度
node.y = first.y + childrenHeight / 2 - node.height / 2;
} else if (children.length !== 1 || node.height > childrenTotalHeight) {
// 多于一个子节点或者父节点大于所有子节点的总高度
var offset = node.y + (node.height - childrenHeight) / 2 - first.y;
children.forEach(function (c) {
c.translate(0, offset);
});
} else {
// 只有一个子节点
node.y = (first.y + first.height / 2 + last.y + last.height / 2) / 2 - node.height / 2;
}
}
}
var DEFAULT_OPTIONS = {
getSubTreeSep: function getSubTreeSep() {
return 0;
}
};
module.exports = function (root, options) {
if (options === void 0) {
options = {};
}
options = util.assign({}, DEFAULT_OPTIONS, options);
root.parent = {
x: 0,
width: 0,
height: 0,
y: 0
};
// first walk
root.BFTraverse(function (node) {
node.x = node.parent.x + node.parent.width; // simply get x
});
root.parent = null;
// second walk
secondWalk(root, options); // assign sub tree totalHeight
// adjusting
// separating nodes
root.startY = 0;
root.y = root.totalHeight / 2 - root.height / 2;
root.eachNode(function (node) {
var children = node.children;
var len = children.length;
if (len) {
var first = children[0];
first.startY = node.startY + node._subTreeSep;
if (len === 1) {
first.y = node.y + node.height / 2 - first.height / 2;
} else {
first.y = first.startY + first.totalHeight / 2 - first.height / 2;
for (var i = 1; i < len; i++) {
var c = children[i];
c.startY = children[i - 1].startY + children[i - 1].totalHeight;
c.y = c.startY + c.totalHeight / 2 - c.height / 2;
}
}
}
});
// third walk
thirdWalk(root);
};
/***/ })
/******/ ]);
});
//# sourceMappingURL=hierarchy.js.map