From 2e4f86979b5ddb35cb3f304a56f9736a0e412d8d Mon Sep 17 00:00:00 2001 From: Thomas Forgione Date: Thu, 25 May 2023 12:01:45 +0200 Subject: [PATCH] Working on stuff --- index.js | 69 +++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 26 deletions(-) diff --git a/index.js b/index.js index 778b70e..2132f8c 100644 --- a/index.js +++ b/index.js @@ -82,6 +82,9 @@ function help() { const flattenLong = "\x1b[32m--flatten\x1b[0m"; + const allMasksShort = "\x1b[32m-a\x1b[0m"; + const allMasksLong = "\x1b[32m--all-masks\x1b[0m"; + println(`${name} ${version} ${description} @@ -95,7 +98,9 @@ ${args} ${thresholdShort}, ${thresholdLong} Threshold for RGB mask computation (between 0 and 1) ${shrinkShort}, ${shrinkLong} Shrink horizontally leaves' bounding boxes ${flattenLong} Flattens the tree into a list before serializing in JSON - ${forceShort}, ${forceLong} Delete the output directory before generating masks it again`); + ${forceShort}, ${forceLong} Delete the output directory before generating masks it again + ${allMasksShort}, ${allMasksLong} Compute and save all masks` + ); } async function main() { @@ -106,6 +111,7 @@ async function main() { let forceMode = false; let shrinkBoxes = true; let flatten = false; + let allMasks = false; let argIndex = 2; @@ -152,6 +158,12 @@ async function main() { help(); process.exit(0); + case "-a": + case "--all-masks": + allMasks = true; + argIndex++; + break; + default: error("unknown option " + process.argv[argIndex]); help(); @@ -167,6 +179,11 @@ async function main() { process.exit(1); } + if (allMasks && outputDir === null) { + error("in order to compute all masks, you need to specify an output directory"); + process.exit(1); + } + if (threshold !== undefined && isNaN(threshold)) { error(tmp + " is not a valid threshold value"); process.exit(1); @@ -257,8 +274,10 @@ async function main() { } }); - // Take a first screenshot - await page.screenshot({path: (outputDir === null ? __dirname : outputDir) + '/' + 'screenshot1.png'}); + if (outputDir !== null) { + // Take a first screenshot + await page.screenshot({path: outputDir + '/' + 'screenshot1.png'}); + } // Edit the page to shrink elements in order to get better bounding boxes if (shrinkBoxes) { @@ -268,32 +287,30 @@ async function main() { eprintln(); } - // Take another screenshot and check the modification we made didn't change the layout of the page - await page.screenshot({path: (outputDir === null ? __dirname : outputDir) + '/' + 'screenshot2.png'}); + if (outputDir !== null) { + // Take another screenshot and check the modification we made didn't change the layout of the page + await page.screenshot({path: outputDir + '/' + 'screenshot2.png'}); - // Compare both screenshots - let file1 = await fs.readFile((outputDir === null ? __dirname : outputDir) + '/' + 'screenshot1.png'); - let file2 = await fs.readFile((outputDir === null ? __dirname : outputDir) + '/' + 'screenshot2.png'); - let filesAreSame = file1.map((x, i) => x === file2[i]).reduce((a, b) => a && b, true); + // Compare both screenshots + let file1 = await fs.readFile(outputDir + '/' + 'screenshot1.png'); + let file2 = await fs.readFile(outputDir + '/' + 'screenshot2.png'); + let filesAreSame = file1.map((x, i) => x === file2[i]).reduce((a, b) => a && b, true); - if (!filesAreSame) { - // Check psnr - let psnr = await image.psnr( - (outputDir === null ? __dirname : outputDir) + '/' + 'screenshot1.png', - (outputDir === null ? __dirname : outputDir) + '/' + 'screenshot2.png' - ); + if (!filesAreSame) { + // Check psnr + let psnr = await image.psnr(outputDir + '/' + 'screenshot1.png', outputDir + '/' + 'screenshot2.png'); - // Crash if they're different - if (psnr > 0) { - warning(filename + " produced slight diff: psnr = " + psnr); - } else { - await error("page edit changed the layout: psnr = " + psnr); - process.exit(1); + // Crash if they're different + if (psnr > 0) { + warning(filename + " produced slight diff: psnr = " + psnr); + } else { + await error("page edit changed the layout: psnr = " + psnr); + process.exit(1); + } } } - if (outputDir !== null) { // Produce a screenshot without text @@ -324,7 +341,7 @@ async function main() { // Analyse the root and output the result info("performing analysis"); - let analyse = await analyseElement(root, page, outputDir, threshold); + let analyse = await analyseElement(root, page, outputDir, allMasks, threshold); info("analysis done"); // Append the current slide to the output @@ -393,7 +410,7 @@ async function addSpan(element) { // Recursive function to analyse an HTML element. // The output is written in hierarchy. -async function analyseElement(element, page, outputDir = null, threshold = undefined) { +async function analyseElement(element, page, outputDir = null, allMasks = false, threshold = undefined) { // Get some information on the element let tagAttr = await element.getProperty('tagName'); let tagName = await tagAttr.jsonValue(); @@ -424,7 +441,7 @@ async function analyseElement(element, page, outputDir = null, threshold = undef analyse.children = []; - if (outputDir !== null) { + if (outputDir !== null && allMasks) { info("computing screenshots \x1b[34m" + analyse.uuid + "\x1b[0m"); @@ -462,7 +479,7 @@ async function analyseElement(element, page, outputDir = null, threshold = undef for (let child of children) { // Recursively analyse the children - analyse.children.push(await analyseElement(child, page, outputDir, threshold)); + analyse.children.push(await analyseElement(child, page, outputDir, allMasks, threshold)); } }