inno-diagram
Version:
It was created to develop Inno Linc.
126 lines (102 loc) • 3.29 kB
JavaScript
require('../utils/yuml2dot-utils.js')();
module.exports = function(specLines, options)
{
function composeDotExpr(specLines)
{
var obj = JSON.parse(specLines);
var uids = {};
var nodes = [];
var len = 0;
var logicName = obj.logic.name;
var logiclinks = obj.logic.link;
var node = createnode(logicName, true);
var uid = 'A' + (len++).toString();
uids[recordName(logicName)] = uid;
nodes.push([uid, node]);
if (obj.run.length > 0)
{
for(var i = 0; i < obj.run.length;i++)
{
var linkName = obj.run[i].name;
var childnode = createnode(linkName, false);
var uid = 'A' + (len++).toString();
uids[recordName(linkName)] = uid;
nodes.push([uid, childnode]);
}
for (var i = 0; i < obj.run.length; i++)
{
if (obj.run[i].link.length > 0)
{
var links = obj.run[i].link;
var modulename = obj.run[i].name;
nodes = connectLink(nodes, uids, links, modulename);
}
}
nodes = connectLink(nodes, uids, logiclinks, logicName);
}
var dot = " ranksep = " + 0.5 + "\r\n";
dot += " rankdir = " + options.dir + "\r\n";
dot += serializeDotElements(nodes);
dot += '}\r\n';
return dot;
}
function connectLink(nodes, uids, linkobj, tailname)
{
for (var i = 0; i < linkobj.length; i++)
{
var linkName = linkobj[i].split(':');
var edge = createline(tailname, linkName[0]);
var uid1 = uids[recordName(linkName[0])];
var uid2 = uids[recordName(tailname)];
nodes.push([uid1, uid2, edge]);
}
return nodes;
}
function createline(logic, link)
{
var edge = {
shape: "edge",
dir: "both",
style: "dashed",
arrowtail: logic,
arrowhead: link,
labeldistance: 1,
fontsize: 10
}
return edge;
}
function createnode(name, islogic)
{
var _shape = islogic ? "doublecircle" : "record";
var node = {
shape: _shape,
height: 0.5,
fontsize: 10,
margin: "0.20,0.05",
label: escape_label(name),
style: "rounded"
}
return node;
}
function addBarFacet(elements, name)
{
for (var i=0; i<elements.length; i++)
{
if (elements[i].length == 2 && elements[i][0] == name)
{
var node = elements[i][1];
var facetNum = 1;
if (node.label.length > 0)
{
facetNum = node.label.split("|").length + 1;
node.label += "|<f" + facetNum + ">";
}
else
node.label = "<f1>";
return "f" + facetNum;
}
}
return null;
}
return composeDotExpr(specLines, options);
}