;(function(undefined) { 'use strict'; if (typeof sigma === 'undefined') throw 'sigma is not declared'; // Initialize package: sigma.utils.pkg('sigma.parsers'); // Just a basic ID generator: var _id = 0; function edgeId() { return 'e' + (_id++); } /** * If the first arguments is a valid URL, this function loads a GEXF file and * creates a new sigma instance or updates the graph of a given instance. It * is possible to give a callback that will be executed at the end of the * process. And if the first argument is a DOM element, it will skip the * loading step and parse the given XML tree to fill the graph. * * @param {string|DOMElement} target The URL of the GEXF file or a valid * GEXF tree. * @param {object|sigma} sig A sigma configuration object or a * sigma instance. * @param {?function} callback Eventually a callback to execute * after having parsed the file. It will * be called with the related sigma * instance as parameter. */ sigma.parsers.gexf = function(target, sig, callback) { var i, l, arr, obj; function parse(graph) { // Adapt the graph: arr = graph.nodes; for (i = 0, l = arr.length; i < l; i++) { obj = arr[i]; obj.id = obj.id; if (obj.viz && typeof obj.viz === 'object') { if (obj.viz.position && typeof obj.viz.position === 'object') { obj.x = obj.viz.position.x; obj.y = -obj.viz.position.y; // Needed otherwise it's up side down } obj.size = obj.viz.size; obj.color = obj.viz.color; } } arr = graph.edges; for (i = 0, l = arr.length; i < l; i++) { obj = arr[i]; obj.id = typeof obj.id === 'string' ? obj.id : edgeId(); obj.source = '' + obj.source; obj.target = '' + obj.target; if (obj.viz && typeof obj.viz === 'object') { obj.color = obj.viz.color; obj.size = obj.viz.thickness; } // Weight over viz.thickness? obj.size = obj.weight; // Changing type to be direction so it won't mess with sigma's naming obj.direction = obj.type; delete obj.type; } // Update the instance's graph: if (sig instanceof sigma) { sig.graph.clear(); arr = graph.nodes; for (i = 0, l = arr.length; i < l; i++) sig.graph.addNode(arr[i]); arr = graph.edges; for (i = 0, l = arr.length; i < l; i++) sig.graph.addEdge(arr[i]); // ...or instantiate sigma if needed: } else if (typeof sig === 'object') { sig.graph = graph; sig = new sigma(sig); // ...or it's finally the callback: } else if (typeof sig === 'function') { callback = sig; sig = null; } // Call the callback if specified: if (callback) { callback(sig || graph); return; } else return graph; } if (typeof target === 'string') gexf.fetch(target, parse); else if (typeof target === 'object') return parse(gexf.parse(target)); }; }).call(this);