diff options
Diffstat (limited to 'client/src/layout.js')
| -rw-r--r-- | client/src/layout.js | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/client/src/layout.js b/client/src/layout.js new file mode 100644 index 0000000..c9c2a4d --- /dev/null +++ b/client/src/layout.js @@ -0,0 +1,48 @@ +import Viz from './viz.es'; + +const toNumber = (i) => Number(i); +const gv = new Viz({ workerURL: 'lib/lite.render.js' }); + +export default class Layout { + constructor() { + this.src = 'digraph { node [shape="rectangle"];\n'; + } + + addNode(id, width, height) { + this.src += ` "${id}" [fixedsize=true; width=${width / 72}; height=${height / 72}];\n`; + } + + addLink(from, to) { + this.src += ` "${from}" -> "${to}";\n`; + } + + async render() { + this.src += '}'; + + const info = await gv.renderJSONObject(this.src, { format: 'json0' }); + info.objects ||= []; + info.edges ||= []; + const [width, height] = info.bb.split(',').map(toNumber).slice(2); + + const positions = {}; + for (const object of info.objects) { + const [x, y] = object.pos.split(',').map(toNumber); + positions[object.name] = [ x, height - y ]; + } + + const links = info.edges.map((edge) => { + const pos = edge.pos.slice(2); + return pos.split(' ').map(p => { + const [x, y] = p.split(','); + return [toNumber(x), height - toNumber(y)]; + }); + + }); + + return { + width, height, + positions, + links, + }; + } +} |
