|  | /* | 
|  | * 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; | 
|  | } |