const Vex = require('vexflow');
const fs = require('fs');
const { JSDOM } = require('jsdom');
const { registerFont } = require('canvas');
const { jsPDF } = require('jspdf');
if (!fs.existsSync('./output/')) {
fs.mkdirSync('./output/');
}
const fontsDir = '../../node_modules/@vexflow-fonts/';
registerFont(fontsDir + 'bravura/bravura.otf', { family: 'Bravura' });
registerFont(fontsDir + 'academico/academico.otf', { family: 'Academico' });
registerFont(fontsDir + 'petaluma/petaluma.otf', { family: 'Petaluma' });
registerFont(fontsDir + 'petalumascript/petalumascript.otf', { family: 'Petaluma Script' });
const outputFile = 'output/score-canvas.pdf';
const { Stave, StaveNote, Formatter, Renderer } = VexFlow;
VexFlow.setFonts('Bravura');
console.log('VexFlow Build: ' + VexFlow.BUILD.ID);
const dom = new JSDOM(
`<!DOCTYPE html><html><head><style></style></head><body><canvas id="container"></canvas><body></html>`
);
global.window = dom.window;
global.document = dom.window.document;
const canvas = document.getElementById('container');
console.log(canvas.width, canvas.height);
const renderer = new Renderer(canvas, Renderer.Backends.CANVAS);
console.log(canvas.width, canvas.height);
renderer.resize(200, 200);
const context = renderer.getContext();
const stave = new Stave(10, 0, 190);
stave.addClef('treble').addTimeSignature('4/4');
stave.setContext(context).drawWithStyle();
const notes = [
new StaveNote({ keys: ['c/4'], duration: 'q' }),
new StaveNote({ keys: ['d/4'], duration: 'q' }),
new StaveNote({ keys: ['b/4'], duration: 'qr' }),
new StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: 'q' }),
];
Formatter.FormatAndDraw(context, stave, notes);
const doc = new jsPDF();
doc.addImage(canvas.toDataURL(), undefined, 50, 100, 80, 80, undefined, 'NONE', 10 );
doc.save(outputFile);
console.log('Saved a PDF:', outputFile);