Home Reference Source Test

packages/causality-log/src/Vivid/vivid.mixins.node.js

import { default as D3N } from 'vivid.d3-node';
import { default as canvasModule } from 'canvas';
import { default as svg2png } from 'svg2png';
import * as fs from 'fs';
const VividNodeMixins = (BaseVividClass)=> class extends BaseVividClass{
    connect(channel){
        
    }

    async export2png(outputPath){
        const d3n = this.d3plot;
        if (d3n.options.canvas) {
            const canvas = d3n.options.canvas;
            let stream = canvas.pngStream().pipe(fs.createWriteStream(outputPath));
            return new Promise((resolve, reject)=>{
                stream.on('finish', function () { resolve(outputPath); });
            });
        }
        else{
            
            var svgBuffer = Buffer.from(d3n.svgString(), 'utf-8');
            let buffer = await svg2png(svgBuffer);
            return new Promise((resolve, reject)=>{
                fs.writeFile(outputPath, buffer, (err)=>{
                    if(err){ 
                        reject('error export file'); 
                    }
                    else{
                        resolve(outputPath);
                    }
                }); });
        }
    }

    json2css(objectStyle){
        let cssString = Object.entries(objectStyle).reduce((acc1, cur1) => {
                return `${acc1}\n\n${cur1[0]} ` + 
                    Object.keys(cur1[1])
                        .reduce((acc2, cur2) => 
                            `${acc2}\n\t${cur2}: ${cur1[1][cur2]};`, '{') + '\n}';
            }, '');
        return cssString;
    }

    makeSVGnode({width, height, styles}){
        var options = { styles, canvasModule, d3:this.d3 };
        this.d3plot = new D3N(options);
        return this.d3plot.createSVG(width, height);
    }

    makeCanvasNode({width, height}){
        var options = { styles:'', canvasModule, d3:this.d3 };
        this.d3plot = new D3N(options);
        return this.d3plot.createCanvas(width, height);
    }

    async show(option={}){
        let {plotId} = option;
        this.open = require("open");
        await this.export2png(plotId);
        return await this.open(plotId);
    }
};
export default VividNodeMixins;