From 0c98276d324db649c4a15be7859a501588257972 Mon Sep 17 00:00:00 2001 From: s-ol Date: Thu, 13 Jan 2022 18:27:20 +0100 Subject: move everything into client/ --- client/src/layout.js | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 client/src/layout.js (limited to 'client/src/layout.js') 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, + }; + } +} -- cgit v1.2.3