|  | @@ -0,0 +1,113 @@
 | 
	
		
			
				|  |  | +/*
 | 
	
		
			
				|  |  | +  Render each OSMD sample, grab the generated images, and
 | 
	
		
			
				|  |  | +  dump them into a local directory as PNG files.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  inspired by Vexflow's generate_png_images and vexflow-tests.js
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  This is meant to be used with the visual regression test system in
 | 
	
		
			
				|  |  | +  `tools/visual_regression.sh`. (TODO)
 | 
	
		
			
				|  |  | +*/
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// function sleep(ms) {
 | 
	
		
			
				|  |  | +//     return new Promise((resolve) => {
 | 
	
		
			
				|  |  | +//       setTimeout(resolve, ms);
 | 
	
		
			
				|  |  | +//     });
 | 
	
		
			
				|  |  | +// }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// main function
 | 
	
		
			
				|  |  | +async function init() {
 | 
	
		
			
				|  |  | +    console.log("init");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const fs = require('fs');
 | 
	
		
			
				|  |  | +    const [scriptDir, imageDir] = process.argv.slice(2, 4);
 | 
	
		
			
				|  |  | +    const sampleDir = './test/data/';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // Create the image directory if it doesn't exist.
 | 
	
		
			
				|  |  | +    fs.mkdirSync(imageDir, { recursive: true });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const samples = {
 | 
	
		
			
				|  |  | +        "Clementi, M. - Sonatina Op.36 No.1 Pt.1": "MuzioClementi_SonatinaOpus36No1_Part1.xml",
 | 
	
		
			
				|  |  | +        //"Hello World": "HelloWorld.xml",
 | 
	
		
			
				|  |  | +        // "Beethoven, L.v. - An die ferne Geliebte": "Beethoven_AnDieFerneGeliebte.xml",
 | 
	
		
			
				|  |  | +        // "Clementi, M. - Sonatina Op.36 No.1 Pt.2": "MuzioClementi_SonatinaOpus36No1_Part2.xml",
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    const sampleKeys = Object.keys(samples);
 | 
	
		
			
				|  |  | +    const sampleValues = Object.values(samples);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const puppeteer = require('puppeteer');
 | 
	
		
			
				|  |  | +    const browser = await puppeteer.launch({headless: true});
 | 
	
		
			
				|  |  | +    const page = await browser.newPage(); // TODO set width/height
 | 
	
		
			
				|  |  | +    const sampleFileName = sampleKeys[0]; // TODO for loop over samples / take filenames from script arguments
 | 
	
		
			
				|  |  | +    const sampleParameter = `&url=${sampleFileName}&endUrl`;
 | 
	
		
			
				|  |  | +    console.log("puppeteer: going to url");
 | 
	
		
			
				|  |  | +    await page.goto("http://localhost:8000/?showHeader=0&debugControls=0&backendType=canvas&pageBackgroundColor=FFFFFF" + sampleParameter, {waitUntil: 'networkidle2'});
 | 
	
		
			
				|  |  | +    console.log("goto done");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        // fix navigation error
 | 
	
		
			
				|  |  | +        var response_event_occurred = false;
 | 
	
		
			
				|  |  | +        var response_handler = function(event){ response_event_occurred = true; };
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        var response_watcher = new Promise(function(resolve, reject){
 | 
	
		
			
				|  |  | +            setTimeout(function(){
 | 
	
		
			
				|  |  | +            if (!response_event_occurred) {
 | 
	
		
			
				|  |  | +                resolve(true); 
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +                setTimeout(function(){ resolve(true); }, 30000);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            page.removeListener('response', response_handler);
 | 
	
		
			
				|  |  | +            }, 500);
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        page.on('response', response_handler);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        var navigation_watcher = page.waitForNavigation();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        await Promise.race([response_watcher, navigation_watcher]);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    console.log("navigation race done");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const getDataUrl = async () => {
 | 
	
		
			
				|  |  | +        return await page.evaluate(async () => {
 | 
	
		
			
				|  |  | +            return await new Promise(resolve => {
 | 
	
		
			
				|  |  | +                const canvasImage = document.getElementById("osmdCanvasVexFlowBackendCanvas");
 | 
	
		
			
				|  |  | +                var imageData = canvasImage.toDataURL();
 | 
	
		
			
				|  |  | +                // TODO fetch multiple pages from multiple OSMD backends
 | 
	
		
			
				|  |  | +                resolve(imageData);
 | 
	
		
			
				|  |  | +            })
 | 
	
		
			
				|  |  | +        })
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    const dataUrl = await getDataUrl();
 | 
	
		
			
				|  |  | +    //console.log("dataUrl: " + dataUrl);
 | 
	
		
			
				|  |  | +    const imageData = dataUrl.split(';base64,').pop();
 | 
	
		
			
				|  |  | +    const imageBuffer = Buffer.from(imageData, 'base64');
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    var fileName = `${imageDir}/${sampleFileName}.png`;
 | 
	
		
			
				|  |  | +    console.log("got image data, saving to: " + fileName);
 | 
	
		
			
				|  |  | +    fs.writeFileSync(fileName, imageBuffer, { encoding: 'base64' });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    //const html = await page.content();
 | 
	
		
			
				|  |  | +    //console.log("page content: " + html);
 | 
	
		
			
				|  |  | +    browser.close();
 | 
	
		
			
				|  |  | +    console.log("puppeteer browser closed. exiting.");
 | 
	
		
			
				|  |  | +    return;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// function start() {
 | 
	
		
			
				|  |  | +//     // await (async () => {
 | 
	
		
			
				|  |  | +//     //     init();
 | 
	
		
			
				|  |  | +//     // });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +//     (async function(){
 | 
	
		
			
				|  |  | +//         await init();
 | 
	
		
			
				|  |  | +//         // more code here or the await is useless
 | 
	
		
			
				|  |  | +//     })();
 | 
	
		
			
				|  |  | +// }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +function resizeCanvas(elementId, width, height) {
 | 
	
		
			
				|  |  | +    $('#' + elementId).width(width);
 | 
	
		
			
				|  |  | +    $('#' + elementId).attr('width', width);
 | 
	
		
			
				|  |  | +    $('#' + elementId).attr('height', height);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +init();
 |