{
graph;
let items = JSON.parse(json3).scope
function* getDependencies(item) {
if (typeof (item) !== 'object') {
return
}
if (Object.values(item).includes('ValueRef')) {
yield item
}
for (let i of Object.values(item)) {
yield* getDependencies(i)
}
}
function createNode(item) {
let i = item[0]
item = item[1]
let t = item.type
let label = ''
switch (t) {
case 'Invocation':
let args = item.arguments
// if(Object.keys(args).includes('key')) {
// label += '(key=' + args.key + ')'
// }
// if(Object.keys(args).includes('id')) {
// label += '(id=' + args.id + ')'
// }
// ['leftField', 'leftValue', 'rightField', 'rightValue'].map(function(a) {
// if(Object.keys(args).includes(a)) {
// if(typeof(args[a]) !== 'object') {
// label += '(' + a + '=' + args[a] + ')'
// }
// }
// })
// if(Object.keys(args).includes('property')) {
// label += '(property=' + args.property + ')'
// }
// include only simple args
//let argsCopy = JSON.parse(JSON.stringify(args))
let refArgs = Object.entries(args).filter(a => a[1].type === 'ValueRef')
let simpleArgs = Object.entries(args).filter(a => !a[1].type || a[1].type !== 'ValueRef')
label += item.functionName + '()'
for(let a of simpleArgs) {
label += '\n' + a[0] + ': ' + a[1]
}
break;
case 'Dictionary':
label += JSON.stringify(item.value)
break;
case 'Feature':
break;
default:
if (Object.keys(item).includes('coordinates') || t === 'Function') {
label += item.type
} else {
if (Array.isArray(item) && typeof (item[0]) === 'object') {
label += '[]'
} else {
label += JSON.stringify(item)
}
}
}
return { data: { id: i, label: label, content: item } }
}
let nodes = items.map(createNode)
let rootNodeId = nodes[nodes.length - 1].data.id
let edges = []
for (let item of items) {
for (let d of getDependencies(item)) {
let source = d.value
let target = item[0]
let targetNode = nodes.filter(n => n.data.id === target)[0]
let label = ''
console.log('target: ', targetNode)
console.log('source: ', source)
let targetArgs = Object.entries(targetNode.data.content.arguments)
if(targetArgs) {
let sourceNodeArgument = targetArgs.filter(a => a[1].value == source)
if(sourceNodeArgument) {
label = '#' + sourceNodeArgument[0][0]
}
}
let id = source + '->' + target
edges.push({
data: { id: id, source: source, target: target, label: label },
})
}
}
var cy = cytoscape({
container: document.getElementById('myGraph'), // container to render in
elements: {
nodes: nodes,
edges: edges,
},
// layout: layoutCola,
style: [
{
selector: 'node',
style: {
'label': 'data(label)',
'text-wrap': 'wrap',
'font-size': 12,
//'text-halign': 'right'
//'text-valign': 'center'
}
},
{
selector: 'edge',
style: {
'width': 3,
'arrow-scale': 2,
//'font-style': 'italic',
'font-size': 12,
'source-arrow-shape': 'triangle',
'label': 'data(label)',
"curve-style": "bezier",
}
}
]
});
let rootNode = cy.getElementById(rootNodeId)
rootNode.style({ 'background-color': 'magenta' })
/*
let popper = rootNode.popper({
content: () => {
let div = document.createElement('div');
div.innerHTML = 'ROOT';
document.body.appendChild( div );
return div;
},
// renderedPosition: () => ({ x: 100, y: 200 }),
});
let update = () => {
popper.scheduleUpdate();
};
rootNode.on('position', update);
cy.on('pan zoom resize', update);}
*/
//var spread = require('cytoscape-spread');
// spread( cytoscape ); // register extension
}