36 lines
834 B
JavaScript
36 lines
834 B
JavaScript
|
import { spawn } from 'child_process';
|
||
|
import xml2js from 'xml2js';
|
||
|
|
||
|
const parser = new xml2js.Parser();
|
||
|
const builder = new xml2js.Builder({ headless: true });
|
||
|
|
||
|
const invokeDot = (input, format) => new Promise((resolve, reject) =>
|
||
|
{
|
||
|
const dot = spawn('dot', [`-T${format}`]);
|
||
|
let stdout = '';
|
||
|
|
||
|
dot.stdout.on('data', data => stdout += data);
|
||
|
|
||
|
dot.on('close', code => {
|
||
|
if (code !== 0)
|
||
|
{
|
||
|
reject(new Error(`dot returned error code ${code}`));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
resolve(stdout);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
dot.on('error', reject);
|
||
|
dot.stdin.write(input);
|
||
|
dot.stdin.end();
|
||
|
});
|
||
|
|
||
|
export const toSVG = async input =>
|
||
|
{
|
||
|
const svg = await invokeDot(input, 'svg');
|
||
|
const parsed = await parser.parseStringPromise(svg);
|
||
|
return builder.buildObject(parsed);
|
||
|
};
|