You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
quaggaJS/tasks/uglyasm.js

56 lines
2.0 KiB
JavaScript

/**
* Idea taken from https://github.com/fpirsch/twin-bcrypt/blob/master/Gearfile.js
*/
'use strict';
var fs = require('fs');
module.exports = function(grunt) {
grunt.registerTask('uglyasm', function() {
var code = fs.readFileSync('dist/quagga.js', 'utf-8'),
minifiedCode = fs.readFileSync('dist/quagga.min.js', 'utf-8'),
commentEnd = '/* @preserve ASM END */',
asmStartIdx = code.indexOf('/* @preserve ASM BEGIN */'),
asmEndIdx = code.indexOf(commentEnd),
asmCode = code.substring(asmStartIdx, asmEndIdx + commentEnd.length),
asmFunctionRegex = /function (\w+)\(\w+,\s*\w+,\s*\w+\)\s*\{\s*"use asm";/,
asmModule,
asmModuleName,
asmCodeMinified,
asmMinifiedModuleName;
asmCodeMinified = asmCode
.replace(/\s*\/\/.*/g, '') // remove single-line comments
.replace(/\s*\/\*[^]*?\*\//g, '') // remove multi-line comments
.replace(/\n\s*/g, '') // remove indentation
.replace(/ ([+=^|&]|>+|<+) /g, '$1') // remove spaces around operators
.replace(/[\r\n/]/g, ''); // remove new lines
grunt.log.debug(asmCodeMinified);
asmModule = asmCode.match(asmFunctionRegex);
if (!asmModule) {
grunt.log.error("No ASM module found");
return;
}
asmModuleName = asmModule[1];
grunt.log.debug(asmModuleName);
asmModule = minifiedCode.match(asmFunctionRegex);
if (!asmModule) {
grunt.log.error("No ASM module found in minified file");
return;
}
asmMinifiedModuleName = asmModule[1];
grunt.log.debug(asmMinifiedModuleName);
asmCodeMinified = asmCodeMinified.replace(asmModuleName, asmMinifiedModuleName);
minifiedCode = minifiedCode.replace(/\/\* @preserve ASM BEGIN \*\/[^]*?\/\* @preserve ASM END \*\//, asmCodeMinified);
fs.writeFileSync('dist/quagga.min.js', minifiedCode);
grunt.log.ok('dist/quagga.min.js written');
});
};