diff options
| author | Ruben Beltran del Rio <ruben@unlimited.pizza> | 2020-09-20 18:41:08 +0200 |
|---|---|---|
| committer | Ruben Beltran del Rio <ruben@unlimited.pizza> | 2020-09-20 18:41:08 +0200 |
| commit | a597c68201245e9e7b7d3d2ef62134588581ed3f (patch) | |
| tree | b8ecfc6b3ea2bb7efccea17e7439fb162ce5beb0 /lib/graphviz_to_grafn.js | |
Diffstat (limited to 'lib/graphviz_to_grafn.js')
| -rw-r--r-- | lib/graphviz_to_grafn.js | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/lib/graphviz_to_grafn.js b/lib/graphviz_to_grafn.js new file mode 100644 index 0000000..e001e12 --- /dev/null +++ b/lib/graphviz_to_grafn.js @@ -0,0 +1,64 @@ +'use strict'; + +const DotParser = require('dotparser'); + +const internals = { + + // Extract vertices and dependencies + + parseDotObject(entries) { + + const vertices = new Set(); + const dependencies = {}; + + entries.forEach((entry) => { + + if (entry.node_id) { + vertices.add(entry.node_id.id); + } + + if (entry.edge_list) { + vertices.add(entry.edge_list[0].id); + vertices.add(entry.edge_list[1].id); + + dependencies[entry.edge_list[1].id] = dependencies[entry.edge_list[1].id] || new Set(); + dependencies[entry.edge_list[1].id].add(entry.edge_list[0].id); + } + + }); + + return { + vertices, + dependencies + }; + }, + + // Generate grafn code from a list of vertices and dependencies + + generateCode(vertices, dependencies) { + + const code = ['const Grafn = require(\'grafn\')', 'const graph = new Grafn()']; + + for (const vertex of vertices) { + const vertexDependencies = Array.from(dependencies[vertex] || []); + + code.push('graph.vertex({'); + code.push(` name: '${vertex}',`); + code.push(` dependencies: ${JSON.stringify(vertexDependencies).replace(/"/g, '\'')},`); + code.push(' action: async () => {}'); + code.push('});'); + } + + return code.join('\n'); + } +}; + +// Take some dot source code... make it grafn source code. + +module.exports = function graphvizToGrafn(dotSource) { + + const dotObject = DotParser(dotSource); + const { vertices, dependencies } = internals.parseDotObject(dotObject[0].children); + + return internals.generateCode(vertices, dependencies); +}; |