UNPKG

sbgnml-to-cytoscape

Version:

A tool to convert sbgn-ml files to json for Cytoscape.js

62 lines (48 loc) 1.86 kB
const objPath = require('object-path'); const getId = (arc) => objPath.get(arc, '_attributes.id'); const getClass = (arc) => objPath.get(arc, '_attributes.class', ''); const getSource = (arc, nodeIdSet, portIdMap) => { const portSource = getPortSource(arc); return nodeIdSet.has(portSource) ? portSource : portIdMap.get(portSource); }; const getTarget = (arc, nodeIdSet, portIdMap) => { const portTarget = getPortTarget(arc); return nodeIdSet.has(portTarget) ? portTarget : portIdMap.get(portTarget); }; const getPortSource = (arc) => objPath.get(arc, '_attributes.source', ''); const getPortTarget = (arc) => objPath.get(arc, '_attributes.target', ''); const getCardinality = (glyph) => parseInt(objPath.get(glyph, 'label._attributes.text', '')); const getBendPointPositions = (arc) => { return [].concat(objPath.get(arc, 'next', [])) .map((bendPoint) => { return { x: parseInt(bendPoint.x), y: parseInt(bendPoint.y) }; }); }; const convertArc = (arc, nodeIdSet, portIdMap) => { return { data: { id: getId(arc), 'class': getClass(arc), cardinality: arc.glyph ? getCardinality(arc.glyph): 0, source: getSource(arc, nodeIdSet, portIdMap), target: getTarget(arc, nodeIdSet, portIdMap), bendPointPositions: getBendPointPositions(arc), portSource: getPortSource(arc), portTarget: getPortTarget(arc) } }; }; const validArc = (arc, nodeIdSet, portIdMap) => { const srcNodeId = getSource(arc, nodeIdSet, portIdMap); const tgtNodeId = getTarget(arc, nodeIdSet, portIdMap); return (nodeIdSet.has(srcNodeId)) && (nodeIdSet.has(tgtNodeId)); }; const convertEdges = (arcs, nodeIdSet, portIdMap) => { return arcs .filter((arc) => validArc(arc, nodeIdSet, portIdMap)) .map((arc) => convertArc(arc, nodeIdSet, portIdMap)); }; module.exports = convertEdges;