graphology-svg
Version:
SVG rendering routines for graphology.
85 lines (63 loc) • 1.75 kB
JavaScript
/**
* Graphology SVG Helpers
* ======================
*
* Micellaneous helper functions used throughout the library.
*/
var defaults = require('./defaults.js');
// Taken from @jacomyma (graph-recipes)
function reduceNodes(graph, settings) {
var width = settings.width,
height = settings.height;
var xBarycenter = 0,
yBarycenter = 0,
totalWeight = 0;
var data = {};
graph.forEachNode(function (node, attr) {
// Applying user's reducing logic
if (typeof settings.nodes.reducer === 'function')
attr = settings.nodes.reducer(settings, node, attr);
attr = defaults.DEFAULT_NODE_REDUCER(settings, node, attr);
data[node] = attr;
// Computing rescaling items
xBarycenter += attr.size * attr.x;
yBarycenter += attr.size * attr.y;
totalWeight += attr.size;
});
xBarycenter /= totalWeight;
yBarycenter /= totalWeight;
var d, ratio, n;
var dMax = -Infinity;
var k;
for (k in data) {
n = data[k];
d = Math.pow(n.x - xBarycenter, 2) + Math.pow(n.y - yBarycenter, 2);
if (d > dMax) dMax = d;
}
ratio =
(Math.min(width, height) - 2 * settings.margin) / (2 * Math.sqrt(dMax));
for (k in data) {
n = data[k];
n.x = width / 2 + (n.x - xBarycenter) * ratio;
n.y = height / 2 + (n.y - yBarycenter) * ratio;
n.size *= ratio; // TODO: keep?
}
return data;
}
// Minimalist XML escaping function
var ESCAPE_PATTERN = /["'<>&]/g;
var ESCAPE_MAP = {
'"': '"',
"'": ''',
'<': '<',
'>': '>',
'&': '&'
};
function escapeReplacer(char) {
return ESCAPE_MAP[char];
}
function escape(string) {
return string.replace(ESCAPE_PATTERN, escapeReplacer);
}
exports.reduceNodes = reduceNodes;
exports.escape = escape;