--- /dev/null
+// Mathieu Jacomy @ Sciences Po Médialab & WebAtlas\r
+// (requires sigma.js to be loaded)\r
+sigma.publicPrototype.parseGexf = function(gexfPath) {\r
+ // Load XML file:\r
+ var gexfhttp, gexf;\r
+ var sigmaInstance = this;\r
+ gexfhttp = window.XMLHttpRequest ?\r
+ new XMLHttpRequest() :\r
+ new ActiveXObject('Microsoft.XMLHTTP');\r
+\r
+ gexfhttp.overrideMimeType('text/xml');\r
+ gexfhttp.open('GET', gexfPath, false);\r
+ gexfhttp.send();\r
+ gexf = gexfhttp.responseXML;\r
+\r
+ var viz='http://www.gexf.net/1.2draft/viz'; // Vis namespace\r
+ var i, j, k;\r
+\r
+ // Parse Attributes\r
+ // This is confusing, so I'll comment heavily\r
+ var nodesAttributes = []; // The list of attributes of the nodes of the graph that we build in json\r
+ var edgesAttributes = []; // The list of attributes of the edges of the graph that we build in json\r
+ var attributesNodes = gexf.getElementsByTagName('attributes'); // In the gexf (that is an xml), the list of xml nodes 'attributes' (note the plural 's')\r
+\r
+ \r
+ for(i = 0; i<attributesNodes.length; i++){\r
+ var attributesNode = attributesNodes[i]; // attributesNode is each xml node 'attributes' (plural)\r
+\r
+ if(attributesNode.getAttribute('class') == 'node'){\r
+ var attributeNodes = attributesNode.getElementsByTagName('attribute'); // The list of xml nodes 'attribute' (no 's')\r
+ for(j = 0; j<attributeNodes.length; j++){\r
+ var attributeNode = attributeNodes[j]; // Each xml node 'attribute'\r
+ \r
+ var id = attributeNode.getAttribute('id'),\r
+ title = attributeNode.getAttribute('title'),\r
+ type = attributeNode.getAttribute('type');\r
+ \r
+ var attribute = {id:id, title:title, type:type};\r
+ nodesAttributes.push(attribute);\r
+ }\r
+ } else if(attributesNode.getAttribute('class') == 'edge'){\r
+ var attributeNodes = attributesNode.getElementsByTagName('attribute'); // The list of xml nodes 'attribute' (no 's')\r
+ for(j = 0; j<attributeNodes.length; j++){\r
+ var attributeNode = attributeNodes[j]; // Each xml node 'attribute'\r
+ \r
+ var id = attributeNode.getAttribute('id'),\r
+ title = attributeNode.getAttribute('title'),\r
+ type = attributeNode.getAttribute('type');\r
+ \r
+ var attribute = {id:id, title:title, type:type};\r
+ edgesAttributes.push(attribute);\r
+ \r
+ }\r
+ }\r
+ }\r
+ \r
+ var nodes = []; // The nodes of the graph\r
+ var nodesNodes = gexf.getElementsByTagName('nodes') // The list of xml nodes 'nodes' (plural)\r
+ \r
+ for(i=0; i<nodesNodes.length; i++){\r
+ var nodesNode = nodesNodes[i]; // Each xml node 'nodes' (plural)\r
+ var nodeNodes = nodesNode.getElementsByTagName('node'); // The list of xml nodes 'node' (no 's')\r
+\r
+ for(j=0; j<nodeNodes.length; j++){\r
+ var nodeNode = nodeNodes[j]; // Each xml node 'node' (no 's')\r
+ \r
+ window.NODE = nodeNode;\r
+\r
+ var id = nodeNode.getAttribute('id');\r
+ var label = nodeNode.getAttribute('label') || id;\r
+ \r
+ //viz\r
+ var size = 1;\r
+ var x = 100 - 200*Math.random();\r
+ var y = 100 - 200*Math.random();\r
+ var color;\r
+ \r
+ var sizeNodes = nodeNode.getElementsByTagName('size');\r
+ sizeNodes = sizeNodes.length ? \r
+ sizeNodes : \r
+ nodeNode.getElementsByTagNameNS('*','size');\r
+ if(sizeNodes.length>0){\r
+ sizeNode = sizeNodes[0];\r
+ size = parseFloat(sizeNode.getAttribute('value'));\r
+ }\r
+\r
+ var positionNodes = nodeNode.getElementsByTagName('position');\r
+ positionNodes = positionNodes.length ? \r
+ positionNodes : \r
+ nodeNode.getElementsByTagNameNS('*','position');\r
+ if(positionNodes.length>0){\r
+ var positionNode = positionNodes[0];\r
+ x = parseFloat(positionNode.getAttribute('x'));\r
+ y = parseFloat(positionNode.getAttribute('y'));\r
+ }\r
+\r
+ var colorNodes = nodeNode.getElementsByTagName('color');\r
+ colorNodes = colorNodes.length ? \r
+ colorNodes : \r
+ nodeNode.getElementsByTagNameNS('*','color');\r
+ if(colorNodes.length>0){\r
+ colorNode = colorNodes[0];\r
+ color = '#'+sigma.tools.rgbToHex(parseFloat(colorNode.getAttribute('r')),\r
+ parseFloat(colorNode.getAttribute('g')),\r
+ parseFloat(colorNode.getAttribute('b')));\r
+ }\r
+ \r
+ // Create Node\r
+ var node = {label:label, size:size, x:x, y:y, attributes:[], color:color}; // The graph node\r
+ \r
+ // Attribute values\r
+ var attvalueNodes = nodeNode.getElementsByTagName('attvalue');\r
+ for(k=0; k<attvalueNodes.length; k++){\r
+ var attvalueNode = attvalueNodes[k];\r
+ var attr = attvalueNode.getAttribute('for');\r
+ var title = nodesAttributes[k]['title']\r
+ var val = attvalueNode.getAttribute('value');\r
+ node.attributes.push({attr:title, val:val});\r
+ }\r
+\r
+ sigmaInstance.addNode(id,node);\r
+ }\r
+ }\r
+\r
+ var edges = [];\r
+ var edgeId = 0;\r
+ var edgesNodes = gexf.getElementsByTagName('edges');\r
+ for(i=0; i<edgesNodes.length; i++){\r
+ var edgesNode = edgesNodes[i];\r
+ var edgeNodes = edgesNode.getElementsByTagName('edge');\r
+ for(j=0; j<edgeNodes.length; j++){\r
+ var edgeNode = edgeNodes[j];\r
+ var source = edgeNode.getAttribute('source');\r
+ var target = edgeNode.getAttribute('target');\r
+ var label = edgeNode.getAttribute('label');\r
+ var edge = {\r
+ id: j,\r
+ sourceID: source,\r
+ targetID: target,\r
+ label: label,\r
+ attributes: []\r
+ };\r
+\r
+ var weight = edgeNode.getAttribute('weight');\r
+ if(weight!=undefined){\r
+ edge['weight'] = weight;\r
+ }\r
+\r
+ var attvalueNodes = edgeNode.getElementsByTagName('attvalue');\r
+ for(k=0; k<attvalueNodes.length; k++){\r
+ var attvalueNode = attvalueNodes[k];\r
+ var attr = attvalueNode.getAttribute('for');\r
+ var val = attvalueNode.getAttribute('value');\r
+ edge.attributes.push({attr:attr, val:val});\r
+ }\r
+\r
+ sigmaInstance.addEdge(edgeId++,source,target,edge);\r
+ }\r
+ }\r
+};\r