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, }; } }