Spaces:
Running
Running
/* | |
* Licensed to the Apache Software Foundation (ASF) under one | |
* or more contributor license agreements. See the NOTICE file | |
* distributed with this work for additional information | |
* regarding copyright ownership. The ASF licenses this file | |
* to you under the Apache License, Version 2.0 (the | |
* "License"); you may not use this file except in compliance | |
* with the License. You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, | |
* software distributed under the License is distributed on an | |
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
* KIND, either express or implied. See the License for the | |
* specific language governing permissions and limitations | |
* under the License. | |
*/ | |
// @ts-nocheck | |
/** | |
* This is a parse of GEXF. | |
* | |
* The spec of GEXF: | |
* https://gephi.org/gexf/1.2draft/gexf-12draft-primer.pdf | |
*/ | |
import * as zrUtil from 'zrender/src/core/util'; | |
export function parse(xml) { | |
let doc; | |
if (typeof xml === 'string') { | |
const parser = new DOMParser(); | |
doc = parser.parseFromString(xml, 'text/xml'); | |
} | |
else { | |
doc = xml; | |
} | |
if (!doc || doc.getElementsByTagName('parsererror').length) { | |
return null; | |
} | |
const gexfRoot = getChildByTagName(doc, 'gexf'); | |
if (!gexfRoot) { | |
return null; | |
} | |
const graphRoot = getChildByTagName(gexfRoot, 'graph'); | |
const attributes = parseAttributes(getChildByTagName(graphRoot, 'attributes')); | |
const attributesMap = {}; | |
for (let i = 0; i < attributes.length; i++) { | |
attributesMap[attributes[i].id] = attributes[i]; | |
} | |
return { | |
nodes: parseNodes(getChildByTagName(graphRoot, 'nodes'), attributesMap), | |
links: parseEdges(getChildByTagName(graphRoot, 'edges')) | |
}; | |
} | |
function parseAttributes(parent) { | |
return parent ? zrUtil.map(getChildrenByTagName(parent, 'attribute'), function (attribDom) { | |
return { | |
id: getAttr(attribDom, 'id'), | |
title: getAttr(attribDom, 'title'), | |
type: getAttr(attribDom, 'type') | |
}; | |
}) : []; | |
} | |
function parseNodes(parent, attributesMap) { | |
return parent ? zrUtil.map(getChildrenByTagName(parent, 'node'), function (nodeDom) { | |
const id = getAttr(nodeDom, 'id'); | |
const label = getAttr(nodeDom, 'label'); | |
const node = { | |
id: id, | |
name: label, | |
itemStyle: { | |
normal: {} | |
} | |
}; | |
const vizSizeDom = getChildByTagName(nodeDom, 'viz:size'); | |
const vizPosDom = getChildByTagName(nodeDom, 'viz:position'); | |
const vizColorDom = getChildByTagName(nodeDom, 'viz:color'); | |
// let vizShapeDom = getChildByTagName(nodeDom, 'viz:shape'); | |
const attvaluesDom = getChildByTagName(nodeDom, 'attvalues'); | |
if (vizSizeDom) { | |
node.symbolSize = parseFloat(getAttr(vizSizeDom, 'value')); | |
} | |
if (vizPosDom) { | |
node.x = parseFloat(getAttr(vizPosDom, 'x')); | |
node.y = parseFloat(getAttr(vizPosDom, 'y')); | |
// z | |
} | |
if (vizColorDom) { | |
node.itemStyle.normal.color = 'rgb(' + [ | |
getAttr(vizColorDom, 'r') | 0, | |
getAttr(vizColorDom, 'g') | 0, | |
getAttr(vizColorDom, 'b') | 0 | |
].join(',') + ')'; | |
} | |
// if (vizShapeDom) { | |
// node.shape = getAttr(vizShapeDom, 'shape'); | |
// } | |
if (attvaluesDom) { | |
const attvalueDomList = getChildrenByTagName(attvaluesDom, 'attvalue'); | |
node.attributes = {}; | |
for (let j = 0; j < attvalueDomList.length; j++) { | |
const attvalueDom = attvalueDomList[j]; | |
const attId = getAttr(attvalueDom, 'for'); | |
let attValue = getAttr(attvalueDom, 'value'); | |
const attribute = attributesMap[attId]; | |
if (attribute) { | |
switch (attribute.type) { | |
case 'integer': | |
case 'long': | |
attValue = parseInt(attValue, 10); | |
break; | |
case 'float': | |
case 'double': | |
attValue = parseFloat(attValue); | |
break; | |
case 'boolean': | |
attValue = attValue.toLowerCase() === 'true'; | |
break; | |
default: | |
} | |
node.attributes[attId] = attValue; | |
} | |
} | |
} | |
return node; | |
}) : []; | |
} | |
function parseEdges(parent) { | |
return parent ? zrUtil.map(getChildrenByTagName(parent, 'edge'), function (edgeDom) { | |
const id = getAttr(edgeDom, 'id'); | |
const label = getAttr(edgeDom, 'label'); | |
const sourceId = getAttr(edgeDom, 'source'); | |
const targetId = getAttr(edgeDom, 'target'); | |
const edge = { | |
id: id, | |
name: label, | |
source: sourceId, | |
target: targetId, | |
lineStyle: { | |
normal: {} | |
} | |
}; | |
const lineStyle = edge.lineStyle.normal; | |
const vizThicknessDom = getChildByTagName(edgeDom, 'viz:thickness'); | |
const vizColorDom = getChildByTagName(edgeDom, 'viz:color'); | |
// let vizShapeDom = getChildByTagName(edgeDom, 'viz:shape'); | |
if (vizThicknessDom) { | |
lineStyle.width = parseFloat(vizThicknessDom.getAttribute('value')); | |
} | |
if (vizColorDom) { | |
lineStyle.color = 'rgb(' + [ | |
getAttr(vizColorDom, 'r') | 0, | |
getAttr(vizColorDom, 'g') | 0, | |
getAttr(vizColorDom, 'b') | 0 | |
].join(',') + ')'; | |
} | |
// if (vizShapeDom) { | |
// edge.shape = vizShapeDom.getAttribute('shape'); | |
// } | |
return edge; | |
}) : []; | |
} | |
function getAttr(el, attrName) { | |
return el.getAttribute(attrName); | |
} | |
function getChildByTagName(parent, tagName) { | |
let node = parent.firstChild; | |
while (node) { | |
if ( | |
node.nodeType !== 1 | |
|| node.nodeName.toLowerCase() !== tagName.toLowerCase() | |
) { | |
node = node.nextSibling; | |
} | |
else { | |
return node; | |
} | |
} | |
return null; | |
} | |
function getChildrenByTagName(parent, tagName) { | |
let node = parent.firstChild; | |
const children = []; | |
while (node) { | |
if (node.nodeName.toLowerCase() === tagName.toLowerCase()) { | |
children.push(node); | |
} | |
node = node.nextSibling; | |
} | |
return children; | |
} | |