html export : not ready
[iramuteq] / webexport / js / sigma.parseGexf.js
diff --git a/webexport/js/sigma.parseGexf.js b/webexport/js/sigma.parseGexf.js
new file mode 100755 (executable)
index 0000000..59945a8
--- /dev/null
@@ -0,0 +1,160 @@
+// 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